【leetcode】153. 寻找旋转排序数组中的最小值js

目录

题目

代码

题号33搜索旋转排序数组的前置题吧感觉是。

思路跟灵神学的:https://leetcode.cn/problems/find-minimum-in-rotated-sorted-array/solutions/1987499/by-endlesscheng-owgd/

设 x=numsmid 是现在二分取到的数。

把 x 与最后一个数 numsn−1 比大小:

  • 如果 x>numsn−1,那么可以推出以下结论:
    • nums 一定被分成左右两个递增段;
    • 第一段的所有元素均大于第二段的所有元素;
    • x 在第一段。
    • 最小值在第二段。
    • 所以 x 一定在最小值的左边。
  • 如果 x≤numsn−1,那么 x 一定在第二段。(或者 nums 就是递增数组,此时只有一段。)
    • x 要么是最小值,要么在最小值右边。
js 复制代码
/**
 * @param {number[]} nums
 * @return {number}
 */
var findMin = function(nums) {
    let l = 0, r = nums.length - 1;
    while (l <= r) {
        let mid = Math.floor((l + r) / 2);
        if (nums[mid] > nums[nums.length - 1]) {
            l = mid + 1;
        } else {
            r = mid - 1;
        }
    }
    return nums[l];
};

补充

自己写的时候最后 return nums[l] 其实是通过样例找规律出来的,并没有做很严格的边界推理,问了d老师改了一版更标准的写法供参考学习:

js 复制代码
var findMin = function(nums) {
    let left = 0, right = nums.length - 1;
    while (left < right) {                // 循环结束条件:left == right
        const mid = Math.floor((left + right) / 2);
        if (nums[mid] > nums[right]) {    // 最小值在 mid 右侧
            left = mid + 1;
        } else {                          // 最小值在 mid 或 mid 左侧
            right = mid;
        }
    }
    return nums[left];                    // 或者 nums[right]
};
相关推荐
xys_67822 分钟前
深挖数据结构:树和二叉树(上)
数据结构·算法
Interview Aid1121 小时前
Google SWE Intern VO 面经:两轮 Coding,Follow-up 考察 BFS 状态
算法
琳达爱分享1 小时前
从单机令牌桶到集群限流:一次配额超发的复盘
后端·算法
职豚求职小程序1 小时前
中国铁塔2027届校招开启,网申怎么投、笔试面试怎么准备?
面试·职场和发展
range1 小时前
带TTL的LRU缓存的实现-字节手撕-26/10/19
算法
糖果豆豆1 小时前
n log n 到底从哪来?排序下界、2-SAT 与 3-SAT、停机问题,卡的是同一件事
算法·架构
地平线开发者1 小时前
【玩转 征程6 算法工具链:PTQ 工具篇】hb_verifier
算法·自动驾驶
171320330计算机毕设编程1 小时前
计算机毕业设计 基于springboot+vue的在线观鸟视频播放网站 LW PPT
java·大数据·vue.js·spring boot·算法·课程设计
himobrinehacken2 小时前
位运算揭秘:左右移与符号位陷阱
c语言·c++·算法·安全
INGNIGHT2 小时前
815 · 课程表IV(dfs)
算法·深度优先