二分查找
2022-06-02
学习
二分查找总结,模板和相关题
参考邓俊辉老师的《数据结构》56页
- 返回第一个大于target值的索引
//始终满足[0, lo) <= target, [hi, n) > target
public int searchInsert(int[] nums, int target) {
int n = nums.length;
int lo = 0, hi = n;
while(lo < hi){
int mi = (lo + hi) / 2;
if(nums[mi] <= target){
lo = mi + 1;
}else{
hi = mi;
}
}
//最后lo == hi, 返回第一个大于target的索引,返回lo--为插入位置
return lo;
}
- 返回第一大于等于target值的索引
//始终满足[0, lo) < target, [hi, n) >= target
public int searchInsert(int[] nums, int target) {
int n = nums.length;
int lo = 0, hi = n;
while(lo < hi){
int mi = (lo + hi) / 2;
if(nums[mi] < target){
lo = mi + 1;
}else{
hi = mi;
}
}
//最后lo == hi, 返回第一大于等于target的索引
return lo;
}
这两种情况应该够用了。右边界取n还是n-1看具体情况,返回第一个大于或大于等于的,下标可能在n(即所有数都比target小),[lo,hi]是所求的下标范围,能取到n那hi就定到n。
有时候mi需要向上取整,这就不记了
相关题:
- 540,记住
- 153,比较mi和hi