二分算法

一、二分查找

1. 整数二分

二分查找:也称折半搜索,对数搜索,是用来在一个有序数组中查找某一元素的算法。

例子:在一个升序数组中查找一个数。每次考察数组当前部分的中间元素(middle),如果中间元素刚好是目标元素(target),就结束搜索。如果中间元素小于所查找的值,就在数组左半部分[left,middle]查找;如果中间元素大于所查找的值,就在数组右半部分[middle,right]查找。

二分搜索法可以用来查找满足某一条件的最大(最小)值。

要求满足某种条件的最大值最小可能情况(最大值最小化),首先的想法是从小到大枚举这个作为答案的[最大值],然后去判断是否合法。若答案单调,就可以使用二分搜索法来更快的找到答案

使用二分搜索法解决[最大值最小化]条件:

  1. 答案在一个固定区间内
  2. 比较容易判断某个值是否符合条件
  3. 可行解对于区间满足一定的单调性(x符合条件,那么x-1或x+1也符合条件)
  • 时间复杂度:最优情况O(1),平均/最坏时间复杂度O(log n)

1.1 二分查找算法模板1

算法思路

假设目标值在闭区间[l,r]中,每次将区间长度缩小一半,当l=mid时,找到目标值

区间[l,r]划分为[l,mid-1]和[mid+1,r];更新操作为r=mid-1或l=mid+1。

int binarySearch(int[] nums, int target){
  if(nums == null || nums.length == 0){ //数组为空
    return -1;
  }
  int l = 0, r = nums.length - 1; //设置左右边界
  while(l <= r){ 
    int mid = l + (r-l) / 2; // 等同于mid=(l+r)/2,这种写法是为了防止数组越界,也可以写为(l+r) >>> 1
    if(nums[mid] == target){ //最终target=mid,输出mid
        return mid; 
    }else if(nums[mid] < target) { //目标值在(mid,r]之间
        l = mid + 1; 
    }else {  //目标值在[l,mid)之间
        r = mid - 1; 
    }
  }
  // 最后判断: l>r 即数组不存在
  return -1;
}

 

https://blog.csdn.net/lll123789456hhh/article/details/128070117

https://www.cnblogs.com/binarylei/p/12426843.html

 

posted @ 2024-03-05 13:59  wq9  阅读(25)  评论(0)    收藏  举报