【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]
};
相关推荐
小七在进步6 小时前
类和对象(五)
java·开发语言·算法
鑫 源6 小时前
VS2019 for mac里用c#开发Mac OS应用 避坑 和 源码
职场和发展·蓝桥杯
就叫年华吧丶6 小时前
长文档点目录定位总是不准?一个 content-visibility + 平滑滚动引发的连环坑(Vue3 实战)
前端·javascript·算法·vue
FPGA信号处理6 小时前
【信号检测与估计】第四节课:非高斯噪声下的 BLUE、极大似然与 EM 算法
人工智能·算法·机器学习
.道阻且长.7 小时前
C++ 11:可变参数模板
前端·c++·算法
Doubbbbbbble云9 小时前
基于贪心算法的区间覆盖问题求解策略4
算法·贪心算法
不会就选b15 小时前
算法日常・每日刷题--<贪心>25
数据结构·算法
西部驯兽师17 小时前
制造企业的信息化选型课题(一)
职场和发展
Cccp.12319 小时前
【leetcode】(七)前缀树和贪心算法
数据结构·leetcode·贪心算法
天真小巫19 小时前
2026.9.28总结
职场和发展