牛可乐和魔法封印

链接:https://ac.nowcoder.com/acm/problem/235558 来源:牛客网

此题是二分查找,并且考虑到可能有相同的值,就采用了二分查找边界值

import java.util.Scanner;

//牛可乐和魔法封印
public class Main{
	public static void main(String[] args) {
		int n;
		Scanner scan = new Scanner(System.in);
		n=scan.nextInt();
		int[] a = new int[n];
		for(int i=0;i<n;i++) {
			a[i]=scan.nextInt();
		}
		int q;
		q=scan.nextInt();
		while(q!=0) {
			int x,y;
			x=scan.nextInt();
			y=scan.nextInt();
			//定义最大左下标
			int leftIndex=left(a,x);
			//定义最小右下标
			int rightIndex=right(a,y);
			System.out.println(rightIndex-leftIndex+1);
			q--;
		}
		scan.close();
	}
	//左下标
	public static int left(int[] a,int target) {
		int i,j;
		i=0;
		j=a.length-1;
		while(i<=j) {
			int m=(i+j)>>>1;//右移一位,相当于/2
			if(target<=a[m]) {
				j=m-1;
			}else {
				i=m+1;
			}
		}
		return i;//返回右下标,如果有重复元素返回最小的下标
	}
	//右下标
	public static int right(int[] a,int target) {//a为所查数组,target为查询目标值
		int i,j;
		i=0;
		j=a.length-1;
		while(i<=j) {
			int m=(i+j)>>>1;//右移一位,相当于/2
			if(target<a[m]) {
				j=m-1;
			}else {
				i=m+1;
			}
		}
		return j;//返回右下标,如果有重复元素返回最大的下标
	}
}