LeetCode题解:153. 寻找旋转排序数组中的最小值,二分查找,JavaScript,详细注释

原题链接:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/

解题思路:

  1. 根据题意,可以分为两种情况分析:

    • nums[mid] < nums[right]

用例:[5,6,1,2,3,4]

用例:[11,13,15,17]

用例:[3,1,2]

* nums[mid] > nums[right]

用例:[3,4,5,6,1,2]

用例:[2,1]

  1. 该题没有一个目标值供查找,可以让左右指针相遇时,共同指向的就是最小值。因此循环继续条件为left < right
/**
 * @param {number[]} nums
 * @return {number}
 */
var findMin = function (nums) {
  let left = 0; // 二分查找左边界
  let right = nums.length - 1; // 二分查找右边界

  // 由于该题没有目标值可供判断,因此循环需要在left等于right之前退出
  // 两个指针相遇时,表示找到了结果
  while (left < right) {
    // 取两个指针的中点
    const mid = (left + right) >> 1;

    // nums[mid] < nums[right]时,表示旋转点在左半边
    if (nums[mid] < nums[right]) {
      // 由于mid总是向下取整,因此在极限情况,区间只剩两个值时,mid=left,对应用例[3,1,2]
      // 并且该题没有中点等于目标值的判断,因此中点必须始终包含在区间内
      right = mid;
    }
    // nums[mid] > nums[right]时,表示旋转点在右半边
    else if (nums[mid] > nums[right]) {
      // 此时中点的值必然不是最小值,因此left可以等于mid+1
      left = mid + 1;
    }
  }

  // 退出循环时,左右指针必然相遇,并且指向最小值,将其返回即可
  return nums[left];
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值