leetcode-javascript icon indicating copy to clipboard operation
leetcode-javascript copied to clipboard

二分查找-704

Open sl1673495 opened this issue 4 years ago • 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;
}

sl1673495 avatar May 08 '20 18:05 sl1673495

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

xiaolannuoyi avatar Apr 29 '21 06:04 xiaolannuoyi

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

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

chinatjc avatar Apr 25 '22 06:04 chinatjc