7月5日算法日记

86 阅读1分钟

1.二分查找

image-20220705222212321

解法

1.双指针

思路

  1. 定义left和right两指针分别从数字的头和尾开始
  2. 在while循环left <=right时,计算mid为 (right-left) /2 +left (一定要这样写,可以防止数字过大导致溢出),mid下标对应的数字为num
  3. 进入if判断(num > target)时,那么right = mid - 1(因为mid已经对比找过了,可以去除了)
  4. 如果num < target ,那么left = mid + 1
  5. 如果num == target,return mid
  6. while结束后还没有找到则返回-1
var search = function(nums, target) {
    let left = 0, right = nums.length - 1
    //注意点1:left <= right最好不要去掉等号,可以省去一次边界判断
    while(left <= right) {
        //注意点2:不要省略 +left,因为可以防止边界溢出
        const mid = Math.floor((right - left) /2) + left
        let num = nums[mid]
        if(num < target) {
            // 注意点3:因为mid已经判断过不符合条件,所以可以+1
            left = mid + 1
        } else if(num > target) {
            // 注意点4:因为mid已经判断过不符合条件,所以可以-1
            right = mid - 1
        } else {
            return mid
        }
    }
    return -1
};