二分查找算法的理解

前言

在做LIS的O(nlgn)算法时,用到了二分查找算法。对于其中的一些条件,例如 l<r 和 l <= r 的区别,r = mid和r = mid-1的区别等等不是很了解,于是进行了一些学习。

找第一次的出现位置

二分查找因为有几个限制,其中一个便是 单调序列 这个要求,所以可能出现 2 3 4 4 4 5 6这样的数组,那么返回第一个出现的位置便是 i = 3时。

i 0 1 2 3 4 5 6
a[i] 2 3 4 4 4 5 6
  • 具体思路 :对于 l = 0,r = 6的区间,每次求mid = l+(r-l)/2 (这里是因为怕溢出,如果是l+r,可能溢出你设置的类型,比如溢出int),判断a[mid]与所查找的数x的大小关系,如果 a[mid] < x,那么l = mid+1。否则 r = mid。这里因为 /2 都是向下取整,所以r = mid ,r右移。
    例如 寻找 4 第一次出现的位置,最后 r = 2,mid = 1,a[mid] < x,l右移,则确定 第一个4.
  • 代码 :
	while (left < right) {
        mid = left + (right - left) / 2;
        if (arr[mid] < target) left = mid + 1;
        else right = mid;
    }

    if (arr[left] == target) return left;
    else return -1;

找最后一次出现的位置

例子和上面的一样

  • 具体思路 :因为要让l 右移,所以每次 mid = l + (r-l+1)/2,代表向上取整,每次判断 a[mid]与x,如果a[mid] > x,r = mid -1。否则 l = mid。这样就能保证返回最后一次出现的位置。

  • 代码:

	 while (left < right) {
        mid = left + (right - left + 1) / 2;
        if (arr[mid] > t) right = mid - 1;
        else left = mid;
    }

    if (arr[left] == target) return left;
    else return -1;

参考链接

www.codebelief.com

Guess you like

Origin blog.csdn.net/qq_39763472/article/details/88670583