BM17 二分查找-I

108 阅读1分钟

问题描述

请实现无重复数字的升序数组的二分查找

给定一个 元素升序的、无重复数字的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标(下标从 0 开始),否则返回 -1

数据范围:0 \le len(nums) \le 2\times10^50≤len(nums)≤2×105 , 数组中任意值满足 |val| \le 10^9∣val∣≤109

进阶:时间复杂度 O(\log n)O(logn) ,空间复杂度 O(1)O(1)

eg:1
输入: [-1,0,3,4,6,10,13,14],13  
返回值: 6
说明: 13 出现在nums中并且下标为 6 

eg:2
输入: [],13  
返回值: -1
说明: 没找到

eg:3
输入: [3,4,6,10,13],14
返回值: -1
说明: 没找到

代码如下:

function search(nums, target) {
  // 1. nums的长度为0,直接返回-1
  // 2. nums长度不为0
  //  2.1 找到了
  //  2.2 没找到
  if (nums.length === 0) {
    return -1;
  }
  let i = 0;
  let j = nums.length - 1;
  while (i <= j) {
    let k = Math.floor((i + j) / 2);
    if (nums[k] === target) {
      return k;
    } else if (nums[k] < target) {
      i = k + 1;
    } else {
      j = k - 1;
    }
  }
}

const nums = [-2, 3, 1, 5, 7, 9, 23];
const target = 7;

总结: 个人理解是,二分法的优势不再是一个都不少的进行遍历,而是以2的指数级别减少运算,这样一来,计算量就会大大减少。