往期回顾
题目描述
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例 1:
输入: nums = [-1,0,3,5,9,12], target = 9 输出: 4 解释: 9 出现在 nums 中并且下标为 4 示例 2:
输入: nums = [-1,0,3,5,9,12], target = 2 输出: -1 解释: 2 不存在 nums 中因此返回 -1
提示:
你可以假设 nums 中的所有元素是不重复的。 n 将在 [1, 10000]之间。 nums 的每个元素都将在 [-9999, 9999]之间。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/bi… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
- 二分查找通常利用有序数组,定义左右指针,left,right,指向数组下标;
- 通过移位运算
>>得到下标的中位数; - 通过while 循环,移动左右指针
- 当 nums[mid]===target ;优先返回命中下标
mid - 其他情况则进行移动左右指针
- 当 nums[mid]>target,目标值只能在mid的左侧,移动右指针:right=mid-1;
- 当 nums[mid]<target, 目标值只能在mid的右侧,移动左指针:left=mid+1;
- 当 nums[mid]===target ;优先返回命中下标
- 否则返回 -1,未命中目标值;
时空复杂度
- 时间复杂度:O(logn),n表示数组的长度
- 空间复杂度:O(1)
代码
function search(nums: number[], target: number): number {
//二分法 左右指针;
let left =0,right=nums.length-1;
while(left<=right){
//移位运算 右移一位相当于除以2
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;
};
往期动态规划回顾
完全背包🎒问题
【温故知新】322. 零钱兑换 动画演示-完全背包问题最小解-动态规划实现
【温故知新】518. 零钱兑换 II 完全背包问题组合解-动态规划实现
【温故知新】377. 组合总和 Ⅳ 完全背包问题排列解-动态规划实现
【温故知新】70. 爬楼梯进阶版 完全背包🎒问题AC-动态规划实现
01背包🎒问题
【温故知新】474. 一和零 01背包🎒问题最大解-动态规划实现
【温故知新】494. 目标和 表达式转化为01背包🎒问题-动态规划实现