二分查找其实就是使用了分治法的思想
- 二分查找基本思想 二分查找的基本思想是将 n 个元素分成大致相等的两部分,取 a[n/2] 与 x 做比较:
- 如果
x = a[n/2], 则找到 x , 算法中止 - 如果
x < a[n/2], 则只需要在数组 a 的左半部分继续搜索 x - 如果
x > a[n/2], 则只需要在数组 a 的右半部分继续搜索 x
- 二分查找时间复杂度
时间复杂度即是 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;
};
结合代码 分别理解下面几种情况就行了
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;
};