【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]
};
相关推荐
一只小小的芙厨16 小时前
基础数论总结
笔记·学习·算法
夜不会漫长18 小时前
C++入门(1)
开发语言·c++·算法
wen_zhufeng18 小时前
IndexTTS 2.5 技术报告
人工智能·算法·机器学习
ITmaster073119 小时前
天天 AI Coding 的你,如果出去面试,你的竞争力是什么?
人工智能·面试·职场和发展
大熊背19 小时前
树莓派相机自动白平衡详解(四)
算法·树莓派·白平衡·isppipeline
一米阳光866119 小时前
软考(中级)软件设计师核心笔记(9)算法——背包问题
笔记·算法·职场发展·软考·软件设计师·中级职称
晚风醉蝶19 小时前
1-11-奇偶排序-OddEvenSort
java·数据结构·算法
旖旎夜光19 小时前
LeetCode 852:山脉数组的峰顶索引(二分查找) —— 题解
数据结构·c++·算法·leetcode·二分查找
..Dauntless..19 小时前
【C++】继承——基类和派生类的配合
开发语言·c++·算法
HY小宝F20 小时前
树莓派 FFmpeg 实战笔记(二):命令行、源码编译与硬件编码的真相
学习·职场和发展·ffmpeg