【力扣算法刷题笔记】1.二分查找

定义

二分查找:在升序数组nums中寻找目标值target,对于特定下标ii,比较nums[i]和target的大小:

  • 如果nums[i]=target,则下标 ii 即为要寻找的下标;
  • 如果nums[i]>target,则target 只可能在下标 ii 的左侧;
  • 如果nums[i]<target,则target 只可能在下标 ii 的右侧。

笔记

主要注意两点:
(1)middle=Math.floor((right - left) / 2) + left;
(2)因为不用和middle比较所以要+1或-1
nums[i] > targt时,在i左侧,所以要改变右侧right=middle-1
nums[i] < targt时,在i右侧,所以要改变左侧left=middle+1

代码

练习一:二分查找

地址:https://leetcode-cn.com/problems/binary-search/

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function(nums, target) {
    let len = nums.length;
    let left = 0, right = len - 1;
    while(left <= right) {
        let middle = Math.floor((right - left) / 2) + left; 
        if(nums[middle] > target) {
            right = middle - 1;
        } else if (nums[middle] < target) {
            left = middle + 1;
        } else if (nums[middle] === target) {
            return middle;
        }
    }
    return -1;
};
练习二:第一个错误版本

地址https://leetcode-cn.com/problems/first-bad-version/

/**
 * Definition for isBadVersion()
 * 
 * @param {integer} version number
 * @return {boolean} whether the version is bad
 * isBadVersion = function(version) {
 *     ...
 * };
 */

/**
 * @param {function} isBadVersion()
 * @return {function}
 */
var solution = function(isBadVersion) {
    /**
     * @param {integer} n Total versions
     * @return {integer} The first bad version
     */
    return function(n) {
        let left = 0, right = n - 1;
        while(left <= right) {
            let middle = left + Math.floor((right - left) / 2);
            if(isBadVersion(middle)) {
                right = middle - 1;
            } else {
                left = middle + 1;
            }
        }
        return left
    };
};
练习三:搜索插入位置

地址: https://leetcode-cn.com/problems/search-insert-position/

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var searchInsert = function(nums, target) {
    let left = 0, right = nums.length - 1;
    while(left <= right) {
        let mid = left + Math.floor((right - left) / 2);
        if (nums[mid] < target) {
            left = mid + 1;
        } else if (nums[mid] > target) {
            right = mid - 1;
        } else if(nums[mid] == target) {
            return mid;
        }
    }
    return nums[right] > target ? right - 1 : right + 1;
};
练习四:34. 在排序数组中查找元素的第一个和最后一个位置

地址:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/
思路:使用二分法找两次,一次最左边一次最右边

const binarySearch = (nums, target, lower) => {
    let left = 0, right = nums.length - 1, ans = nums.length;
    while (left <= right) {
        const mid = Math.floor((left + right) / 2);
        if (nums[mid] > target || (lower && nums[mid] == target)) {
            right = mid - 1;
            ans = mid;
        } else {
            left = mid + 1;
        }
    }
    return ans;
}

var searchRange = function(nums, target) {
    let ans = [-1, -1];
    const leftIdx = binarySearch(nums, target, true);
    const rightIdx = binarySearch(nums, target, false) - 1;
    if (leftIdx <= rightIdx && rightIdx < nums.length && nums[leftIdx] === target && nums[rightIdx] === target) {
        ans = [leftIdx, rightIdx];
    } 
    return ans;
};
练习五:69. x 的平方根

地址:https://leetcode-cn.com/problems/sqrtx/
思路:平方根肯定在中间或者之前,可以拿mid的平方和x比较

/**
 * @param {number} x
 * @return {number}
 */
var mySqrt = function(x) {
  let left = 0, right = x, ans;
  while(left <= right) {
    let mid = Math.floor((left + right) / 2);
    if(mid * mid > x) {
      right = mid - 1;
    } else if (mid * mid <= x) {
      left = mid + 1
      ans = mid;
    }
  }
  return ans;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AtalantaDavis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值