二分查找的方法

1 篇文章 0 订阅

二分查找是一个高效的查找算法,适用范围:最小值/最大值。最快时间等等
约束条件:目标对象必须是必须是有序的
二分查找的应用以及集中变化形式:
1:查找有序数组目标值的位置:找到目标值返回其位置,找不到的话返回-1
int binarySearch(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while(left <= right) {//这里是<=.主要原因是right = size-1
int mid = (right + left) / 2;
if(nums[mid] == target)
return mid;
else if (nums[mid] < target)
left = mid + 1; // 注意
else if (nums[mid] > target)
right = mid - 1; // 注意
}
return -1;
}
2:返回距离其差值的绝对值最小的数的位置,可以是其本身也可以是其左右相邻的值int Bseach(int* arr, int arrSize, int x){
int left = 0;
int right = arrSize -1;
while(left <= right) {
int mid = (left + right)/2;
if(arr[mid] == x){
return mid;
} else if(arr[mid] < x){
left = mid +1;
} else if(arr[mid] >x) {
right = mid -1;
}
}
//寻找最靠近的一个数
if(abs(arr[left] - x) < abs(arr[left-1] -x)){
return left;
}else{
return left -1;
}
}
3:第三种场景如果目标值里面有多个目标对象,寻找左边界,如何寻找
思路:如果寻找到第一个目标值,right = mid,控制右边界,逐渐往左逼近
直到left==ight,搜索区间是[left, right).left == right 时候,区间为[left,left).
int left_bound(int[] nums, int target) {
int left = 0;
int right = nums.size;

while (left < right) { // 搜索区间的变化
    int mid = (left + right) / 2;
    if (nums[mid] == target) {
        right = mid;//右面逐渐逼近
    } else if (nums[mid] < target) {
        left = mid + 1;//左闭右开的区间
    } else if (nums[mid] > target) {
        right = mid; // 左闭右开的区间
    }
}
return left;

}

3:寻找右边界如何找:原理与寻找左边界一样,不停的往右边逼近
int right_bound(int[] nums, int target) {

int left = 0, right = nums.size;

while (left < right) {//搜索区间还是左闭右开
    int mid = (left + right) / 2;
    if (nums[mid] == target) {
        left = mid + 1; //找到第一个以后,左边的值往右逼近一位
    } else if (nums[mid] < target) {
        left = mid + 1;//没有找到,继续右逼近 Mid+1 
    } else if (nums[mid] > target) {
        right = mid; //左闭右开,所以right = mid
    }
}
return left - 1; //最后一个值跳出循环,跳出循环的前面一个值就是目标值

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
4:变体,隐藏查找,查找对象不是给定的数组,而是隐藏的
https://leetcode.cn/problems/magnetic-force-between-two-balls/
两个球之间磁力
以及爱吃香蕉的珂珂
边界值:
int left = 1;//Min force value
int right = position[positionSize -1] - position[0];// max force value
寻找的目标值为Mid。根据Mid来确定磁力大小。
这里对查找对象进行了一次变化
复杂的二分查找都是对查找对象进行变化。
重要的是确定,查找对象,边界值,以及目标值

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值