Skip to content

二分查找-704 #23

Description

@sl1673495

给定一个 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;
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    二分查找例题详解每个分类下会挑出几道题目进行精讲,其他的同类题目会默认拥有这些前置知识而简略讲解。

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions