Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

二分查找-704 #23

Open
sl1673495 opened this issue May 8, 2020 · 2 comments
Open

二分查找-704 #23

sl1673495 opened this issue May 8, 2020 · 2 comments
Labels
二分查找 例题详解 每个分类下会挑出几道题目进行精讲,其他的同类题目会默认拥有这些前置知识而简略讲解。

Comments

@sl1673495
Copy link
Owner

sl1673495 commented May 8, 2020

给定一个 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 sl1673495 added 例题详解 每个分类下会挑出几道题目进行精讲,其他的同类题目会默认拥有这些前置知识而简略讲解。 二分查找 labels May 8, 2020
@xiaolannuoyi
Copy link

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

@steven-fe
Copy link

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
二分查找 例题详解 每个分类下会挑出几道题目进行精讲,其他的同类题目会默认拥有这些前置知识而简略讲解。
Projects
None yet
Development

No branches or pull requests

3 participants