- 给定一个
n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例
输入:nums = [-1,0,3,5,9,12], target = 9 输出: 4, 解释: 9 出现在 nums 中并且下标为 4
输入:nums = [-1,0,3,5,9,12], target = 2 输出:-1, 解释: 2 不存在 nums 中因此返回 -1
提示
- 你可以假设
nums 中的所有元素是不重复的。
n 将在 [1, 10000]之间。
nums 的每个元素都将在 [-9999, 9999]之间。
思路
- 二分查找思路就跟小时候玩的猜价格的游戏一样,给出一个商品,你报一个价格,他会告诉你是高了还是低了,直到你猜出这个商品的价格为止
- 查找思路也是一样的,先找到中间位置的数,比较
target和他的大小,如果大了就取前面一半,然后继续取中间的,这样就每次排除掉原有的一半,直到找到正确答案或者全部找完
代码
function search(nums: number[], target: number): number {
let left = 0;
let right = nums.length - 1;
while(left <= right){
let mid = Math.floor((right - left / 2)) + left;
if(nums[mid] < target){
left = mid + 1;
} else if(nums[mid] > target){
right = mid - 1;
} else {
return mid;
}
}
return - 1;
};
- 这里找中间下标的时候可能出现小数,所以要取整,向下取整或者向上取整都可以