二分查找-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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
二分查找是个很经典的算法了,它的一个典型的特点就是“思路容易,细节非常易错”。
这里就主要讲讲代码里的细节吧:
-
首先,为什么是
while (left <= right)
而不是while (left < right)
?
这是因为要考虑到left
和right
相等的情况,也就是查找区间里只有一个值。 -
为什么
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;
}
if 这么使用并不好,if else 可以减少判断
if 这么使用并不好,if else 可以减少判断
这么理解没有问题,但是打包工具或者js引擎应该会优化这个细节。所以开发人员应该无需关心这个细节,按照习惯书写代码即可。