01.一般的二分套路分析
private static int search(int[] arr, int target) {
int l=0,r=arr.length-1;
while (l<=r) {
int mid=(l+r)>>1;
System.out.println(l+" "+mid+" "+r);
if(arr[mid]==target) return mid;
else if(arr[mid]>target) r=mid-1;
else l=mid+1;
}
return -1;//找不到则返回-1
}
具体案例流程如下
02.查找>=target的第一个元素
private int search(int[] arr, int target) {
int l=0,r=arr.length-1;
while (l<r) {
int mid=(l+r)>>1;
System.out.println(l+" "+mid+" "+r);
if(arr[mid]>=target) r=mid;
else l=mid+1;
}
return r;
}
具体案例流程如下
03.查找<=target的最后一个元素
private static int search(int[] arr, int target) {
int l=0,r=arr.length-1;
while (l<r) {
int mid=(l+r+1)>>1;
System.out.println(l+" "+mid+" "+r);
if(arr[mid]<=target) l=mid;
else r=mid-1;
}
return l;
}
具体案例流程如下
04.练习巩固
- 一元三次方程求解:https://www.luogu.com.cn/problem/P1024
- A-B数对:https://www.luogu.com.cn/problem/P1102
题解:https://blog.csdn.net/qq_46237746/article/details/123797153 - 烦恼的高考志愿:https://www.luogu.com.cn/problem/P1678
题解:https://blog.csdn.net/qq_46237746/article/details/123816172 - 跳石头(普及)https://www.luogu.com.cn/problem/P2678
题解:https://blog.csdn.net/qq_46237746/article/details/123806032