一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情。
本题难度:⭐ ⭐
本题类型:算法、手写
阿林最近忙爆了,真的没时间认真写文章了,但是再忙也不能忘了学习,不然就懈怠了,最近多更新点前端面试中出现的高频算法题吧。
哪怕每天只学习半小时,也有收获,绝对不能懈怠!
题目描述
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
原题地址:leetcode704. 二分查找
题目要求
输入: 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
题目分析
这道题实在太经典了,算法入门必刷题之一。
二分法是为了解决线性查找太慢而发明的算法,可以把查找的时间复杂度从 O(n) 降为 O(logn)。
本题思路:
- 定义左右指针 left 和 right
- 找出中间位置,并判断该位置值是否等于 target
- 中间位置的值和target相等, 则返回中间位置下标
- 中间位置的值 < target, 则 left 指针移到中间
- 中间位置的值 > target, 则 right 指针移到中间
图解:
图片来源,侵删。
编码实现
function search (nums, target) {
let left = 0
let right = nums.length - 1
while(left <= right) {
let mid = (left + right) >> 1 // 找中间值可以用位运算,代码更简洁
if (nums[mid] === target) {
return mid
} else if (nums[mid] > target) {
right = mid - 1
} else {
left = mid + 1
}
}
return -1
}
运行结果
vscode leetcode 插件 yyds! 上班“认真工作”的神器 🐶
结尾
阿林水平有限,文中如果有错误或表达不当的地方,非常欢迎在评论区指出,感谢~
如果我的文章对你有帮助,你的👍就是对我的最大支持^_^
我是阿林,输出洞见技术,再会!
上一篇:
下一篇: