输入样例:
6 3
1 2 2 3 3 4
3
4
5
输出样例:
3 4
5 5
-1 -1
整数二分查找步骤:(y版)
1.找一个区间[L,R],使得答案一定在该区间中。
2.找一个判断条件,使得该判断条件具有二段性,并且答案一定是该二段性的分界点。
3.分析终点M在判断条件下是否成立,如果成立,考虑在哪个区间;如果不成立,考虑答案在哪个区间。
4.如果更新的方式是 r = mid,则不做处理;如果更新的方式是l = mid,则需要在计算mid时加上1.
解题思路:
设要查找x,先通过二分找到x可能存在的最左段,再找到x存在的最右端。
Java代码:
import java.io.*;
public class Main {
public static int []arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] split = br.readLine().split(" ");
int n = Integer.parseInt(split[0]);
int q = Integer.parseInt(split[1]);
arr = new int[n];
split = br.readLine().split(" ");
for(int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(split[i]);
}
for(int i = 0; i < q; i++) {
int t = Integer.parseInt(br.readLine());
binarySearch(t);
}
}
public static void binarySearch(int x) {
int l = 0;
int r = arr.length - 1;
while(l < r) {
int mid = (l + r) >> 1;//r = mid 时不需要加一
if(x <= arr[mid]) {//二分x的左端点,满足二段性,且答案是二分条件的分界点
r = mid;
}else {
l = mid + 1;
}
}//循环退出时,l = r
if(arr[r] == x) {//数组中存在待查找的值
System.out.print(r + " ");
r = arr.length - 1;
while(l < r) {
int mid = l + r + 1 >> 1;//r = left 时需要加一
if(arr[mid] <= x) {
l = mid;
}else {
r = mid - 1;
}
}
System.out.println(r);
}else {
System.out.println("-1 -1");
}
}
}