sl1673495/leetcode-javascript

二分查找-704

sl1673495 opened this issue · 2 comments

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1
 

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-search
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

二分查找是个很经典的算法了,它的一个典型的特点就是“思路容易,细节非常易错”。

这里就主要讲讲代码里的细节吧:

  1. 首先,为什么是 while (left <= right) 而不是 while (left < right)
    这是因为要考虑到 leftright 相等的情况,也就是查找区间里只有一个值。

  2. 为什么 left = mid + 1,这个 +1 是什么?
    这是因为 mid 位置的值已经查找过了,可以往右边跳一位。

  3. 什么情况 left 会超出 right?如果二分查找到的值一直小于目标值,left会不断右移,直到最后数组区间里只有一个值,如果此时这个目标值还是大于这个值,left 会继续加一,此时 left 会超过 right

  4. 反之,则 right 会超出 left

function search(arr, target) {
  let left = 0;
  let right = arr.length - 1;

  while (left <= right) {
    let mid = Math.round((right + left) / 2);
    if (arr[mid] === target) {
      return mid;
    }
    if (arr[mid] < target) {
      left = mid + 1;
    }
    if (arr[mid] > target) {
      right = mid - 1;
    }
  }

  return -1;
}

if 这么使用并不好,if else 可以减少判断

if 这么使用并不好,if else 可以减少判断

这么理解没有问题,但是打包工具或者js引擎应该会优化这个细节。所以开发人员应该无需关心这个细节,按照习惯书写代码即可。