【温故知新】`704. 二分查找` 有序数组中利用双指针遍历查找

451 阅读2分钟

往期回顾

【温故知新】252. 会议室 排序遍历

题目描述

给定一个 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;
  • 否则返回 -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背包🎒问题-动态规划实现

【温故知新】1049. 最后一块石头的重量 II 最小重量转化为01背包🎒问题最大解-动态规划实现

【温故知新】416. 分割等和子集01背包🎒问题存在解-动态规划实现