二分查找-704
给定一个 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; }