问题描述
请实现无重复数字的升序数组的二分查找
给定一个 元素升序的、无重复数字的整型数组 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的指数级别减少运算,这样一来,计算量就会大大减少。