题目
给定一个 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
分析
有两种方法解决
解一:直接查找
利用indexOf()返回目标出现的第一个位置,lastIndexOf()返回目标出现的第二个位置
解二:二分查找
要走注意二分查找使用的一个前提是数组中没有重复的元素
代码
解一:直接查找
let i = nums.indexOf(target)
解二:二分法
var search = function(nums, target) {
let len=nums.length
let left=0, right=len-1
while(right>=left){
let mid = Math.floor((right+left)/2)
if(nums[mid]>target) right = mid - 1
else if(nums[mid]<target) left = mid + 1
else return mid
}
return -1
};
注意点
1.需要注意的第一个点就是边界的确定。
(1)[left,right]:循环的条件就是while(left<=right),左右坐标更新为left=mid+1,right=mid-1
(2)[left,right):循环的条件就是while(left<right),左右坐标更新为left=mid+1,right=mid
2.mid的更新
(1)mid = left +Math.floor((right-left)/2)
(2)mid = Math.floor((right+left)/2)