704. 二分查找

99 阅读1分钟

题目 leetcode.cn/

  • 给定一个 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

提示

  1. 你可以假设 nums 中的所有元素是不重复的。
  2. n 将在 [1, 10000]之间。
  3. 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;
};
  • 这里找中间下标的时候可能出现小数,所以要取整,向下取整或者向上取整都可以