前端面试官:请使用二分法搜索旋转数组

本文介绍了如何使用二分法解决旋转排序数组中的搜索问题。从基本的二分法开始,讨论了在旋转数组中寻找最小值和目标值的策略,包括识别旋转点、区分升序区间并进行针对性的二分查找。文章通过实例分析和代码实现,详细阐述了解决这类问题的思路和方法。
摘要由CSDN通过智能技术生成

🍺 本文首发于:https://www.shaotianyu.com/

目标是把自己知道的东西讲明白

1 基本的二分法是什么样子的

二分法的使用场景,其实比较受限,最明显的特点是:

  • 绝大情况,查找目标具有单调性质(单调递增、单调递减)
  • 有上下边界,并且最好能够通过index下标访问元素

1.1 从头开始,基本的二分法使用

我们从一个最简单的单调递增数组开始说起,问题如下:

在 [1, 2, 3, 4, 5, 6, 7, 8, 9] 中找到 4,若存在则返回下标,不存在返回-1,要求算法复杂度O(logn)

看到上面这题目,O(logn)复杂度的要求,第一反应就是使用二分查找法,怎么做呢?

先在图上模拟以下二分法的大概流程:

http://static.shaotianyu.com/fakebinary-3.png

根据图解,代码如下:

function searchNum (target, nums) {
   
  if (!nums.length) return -1
  let left = 0
  let right = nums.length - 1
  let mid
  while (left <= right) {
   
      // >> 1 位运算代替 除2 取整 操作
      // 为什么不写成 mid = (left+right)/2 ,因为考虑到left+right的溢出边界情况
      mid = left + ((right - left) >> 1)
      if (nums[mid] === target) {
   
          return mid
      }
      if (nums[mid] < target) {
   
          left = mid + 1
      }
      if (nums[mid] > target) {
   
          right = mid - 1
      }
  }
  return -1
}

1.2 小结二分法的套路

我们可以从上面的问题中,看出点二分法的套路出来,二分法是有律可循的,并且可以推导出基础的模板:

let left = start
let right = end
let mid
while (left <= right) {
   
    mid = (left + right) / 2
    if (array[mid] === target) {
   
        return result 或者 break down
    }
    if (array[mid] < target) {
   
        left = mid + 1
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值