二分查找
二分查找
二分查找可以分为查找一个目标值target是否存在和查找一个连续递增的数组中存在着多个相同target的最左边界或者最右边界。
二分查找是否存在target模板
下面这个模板中的输入数组是一个递增数组:
boolean binarySearch(int[] arr,int tar){
int l=0,r=arr.length-1;
while(l<=r){//终止条件是left=right+1
int mid=l+r>>>1;//使用无符号位移防止溢出
if(arr[mid]<tar){
l=mid+1;
}else if(arr[mid]>tar){
r=mid-1;
}else{
return true;
}
}
return false;
}
若果索引是负数的为了防止溢出mid可以使用mid=left+(right-left)/2。
二分查找最左侧的target模板
如果一个递增数组中存在着连续的target而我们需要查找这个数组中最左侧的target的下标:
int ls(int[] nums,int tar){
int l=0,r=nums.length-1;
while(l<r){
int mid=l+r>>>1;//向下取整(最左向下,最右向上)
if(nums[mid]<tar){
l=mid+1;
}else{
r=mid;
}
}
return l;
}
二分查找最右侧target模板
如果一个递增数组中存在着连续的target而我们需要查找这个数组中最右的target的下标:
int rs(int[] nums,int tar){
int l=0,r=nums.length-1;
while(l<r){
int mid=l+r+1>>>1;//向上取整(最左向下,最右向上)
if(nums[mid]>tar){
r=mid-1;
}else{
l=mid;
}
}
return r;
}
二分边界查找相关练习
- 剑指 Offer 53 - I. 在排序数组中查找数字 I
- LeetCode:1011. 在 D 天内送达包裹的能力(capacity-to-ship-packages-within-d-days)

浙公网安备 33010602011771号