【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]
};
相关推荐
Pniubi16 分钟前
力扣54.螺旋矩阵
算法·leetcode·矩阵
choumou_M3 小时前
算法_1:由浅入深学习快速排序QuickSort
学习·算法·排序算法
Coder_Shenshen3 小时前
罗克韦尔ACD工程归档离线变量树解析
算法·c#
心仪久了会沦陷5 小时前
C语言数据结构入门——树与二叉树详解:概念、堆实现与链式遍历
c语言·数据结构·算法
小此方5 小时前
[算法实战论:动态规划]背包问题概念,01不满背包问题,01满背包问题,背包问题的滚动数组空间优化
算法·动态规划
悠仁さん6 小时前
【C++】哈希表
c++·算法·散列表
地平线开发者7 小时前
点云算法整理与常用计算模块:从数据到模型,再到工程与量化
算法·自动驾驶
武子康9 小时前
H3-World 为何在加载 LoRA 前,先检查导入的代码?
人工智能·深度学习·算法
秋天的怀念_David10 小时前
算法一千零一夜 · 第二十八夜 注册
java·程序人生·算法
Rain的Java大神之路12 小时前
LeetCode 37 解数独面试攻略:回溯 + 位掩码 + MRV,从暴力到毫秒级求解
java·后端·leetcode