We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
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
给定一个 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 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二分查找是个很经典的算法了,它的一个典型的特点就是“思路容易,细节非常易错”。
这里就主要讲讲代码里的细节吧:
首先,为什么是 while (left <= right) 而不是 while (left < right)? 这是因为要考虑到 left 和 right 相等的情况,也就是查找区间里只有一个值。
while (left <= right)
while (left < right)
left
right
为什么 left = mid + 1,这个 +1 是什么? 这是因为 mid 位置的值已经查找过了,可以往右边跳一位。
left = mid + 1
+1
mid
什么情况 left 会超出 right?如果二分查找到的值一直小于目标值,left会不断右移,直到最后数组区间里只有一个值,如果此时这个目标值还是大于这个值,left 会继续加一,此时 left 会超过 right。
反之,则 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; }
The text was updated successfully, but these errors were encountered:
if 这么使用并不好,if else 可以减少判断
Sorry, something went wrong.
这么理解没有问题,但是打包工具或者js引擎应该会优化这个细节。所以开发人员应该无需关心这个细节,按照习惯书写代码即可。
No branches or pull requests
给定一个 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
二分查找是个很经典的算法了,它的一个典型的特点就是“思路容易,细节非常易错”。
这里就主要讲讲代码里的细节吧:
首先,为什么是
while (left <= right)
而不是while (left < right)
?这是因为要考虑到
left
和right
相等的情况,也就是查找区间里只有一个值。为什么
left = mid + 1
,这个+1
是什么?这是因为
mid
位置的值已经查找过了,可以往右边跳一位。什么情况
left
会超出right
?如果二分查找到的值一直小于目标值,left会不断右移,直到最后数组区间里只有一个值,如果此时这个目标值还是大于这个值,left
会继续加一,此时left
会超过right
。反之,则
right
会超出left
。The text was updated successfully, but these errors were encountered: