# 1.二分查找(easy)
TIP
更好的阅读体验应该是:
- 审题-思考
- 答题
- 整理-归纳
# 一、题目
LeetCode:704.二分查找 (opens new window)
给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例:
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
你可以假设 nums 中的所有元素是不重复的。
# 二、二分法解题
二分查找是一种基于比较目标值和数组中间元素的教科书式算法。
- 如果目标值等于中间元素,则找到目标值。
- 如果目标值较小,继续在左侧搜索。
- 如果目标值较大,则继续在右侧搜索。
时间复杂度:O(logN)
。
空间复杂度:O(1)
。
# 三、基础模版I
- 确定初始的左右边界:
left
: 0right
: nums.length-1mid
: (left + (right - left) >> 1)
- 如果中间元素值
nums[mid]
< target:证明中间值左侧包括中间值都不符合要求,可以直接排除,left = mid + 1
- 如果中间元素值
nums[mid]
:证明中间值右侧包括中间值都不符合要求,可以直接排除,right = mid - 1
- 如果中间元素值
nums[mid]
= target:直接返回mid
的下标 - 重新定义了左右边界,也需要重新计算中间值,我们需要继续进行范围的排除
- 定义搜索的条件,应该是搜索区间都不为空,即
left <= right
# 四、Js题解
var search = function(nums, target) {
let left = 0; // 初始左边界
let right = nums.length - 1; // 初始右边界
// 如果left > right 证明整个数组结束了仍没有找到目标值
while (left <= right) {
let mid = left + Math.floor((right - left) / 2); //防止溢出
if (target === nums[mid]) {
return mid;
} else if (target > nums[mid]) {
// 目标值大于中值,则中间左侧可以抛弃了
left = mid + 1;
} else {
// 目标值小于中值,则中间右侧可以抛弃了
right = mid - 1;
}
}
return -1;
};
# 三、写在最后
上面的代码就是二分法模板 I,看过我的二分法总结的同学应该知道,凭借这套模版以及对应的分析,类似的问题应该难不住你了。
如果对你有所帮助不妨给本项目的github 点个 star (opens new window),这是对我最大的鼓励
关于我
- 花名:余光
- WX:j565017805
- 沉迷 JS,水平有限,虚心学习中
其他沉淀