704. 二分查找 和 35. 搜索插入位置

160 阅读1分钟

704. 二分查找

二分查找其实就是使用了分治法的思想

  1. 二分查找基本思想 二分查找的基本思想是将 n 个元素分成大致相等的两部分,取 a[n/2] 与 x 做比较:
  • 如果 x = a[n/2], 则找到 x , 算法中止
  • 如果 x < a[n/2], 则只需要在数组 a 的左半部分继续搜索 x
  • 如果 x > a[n/2], 则只需要在数组 a 的右半部分继续搜索 x
  1. 二分查找时间复杂度

时间复杂度即是 while 循环的次数。 总共有 n 个元素,渐渐跟下去就是 n, n/2 , n/4 ,.... n/2 ^ kn/2k(接下来操作元素的剩余个数),其中 k 就是循环的次数 由于 n/(2^k) 取整后 >= 1

即令n/(2^k) = 1

可得 k=log2n,(以2为底,n的对数)

所以时间复杂度可以表示 O(n)=O(log2n) 或者 O(n)=O(logn)

var search = function (nums, target) {
  var left = 0;
  var right = nums.length - 1;
  while (left <= right) {
    var mid = left + ((right - left) >> 1);
    if (nums[mid] == target) {
      return mid;
    } else if (nums[mid] > target) {
      right = mid - 1;
    } else {// (nums[mid] < target)
      left = mid + 1;
    }
  }
  return -1;
};

35. 搜索插入位置

结合代码 分别理解下面几种情况就行了

image.png

var searchInsert = function (nums, target) {
  var len = nums.length;
  var left = 0;
  var right = len - 1;
  var res = len;// [1,3,5,6]   7 这种情况刚好res = len了,这就是为什么初始化为len
  while (left <= right) {
    var mid = ((right - left) >> 1) + left;
    if (nums[mid] >= target) {
      res = mid;
      right = mid - 1;
    } else {
      left = mid + 1;
    }
  }
  return res;
};