【每日算法】LeetCode 153. 寻找旋转排序数组中的最小值

对前端开发者而言,学习算法绝非为了"炫技"。它是你从"页面构建者"迈向"复杂系统设计者"的关键阶梯。它将你的编码能力从"实现功能"提升到"设计优雅、高效解决方案"的层面。从现在开始,每天投入一小段时间,结合前端场景去理解和练习,你将会感受到自身技术视野和问题解决能力的质的飞跃。------ 算法:资深前端开发者的进阶引擎

LeetCode 153. 寻找旋转排序数组中的最小值

1. 题目描述

假设一个按照升序排列的数组在某个未知的"旋转点"上进行了旋转(例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2])。给定一个 互不相同 元素的旋转排序数组 nums,要求找出并返回数组中的 最小元素

示例 1:

复制代码
输入:nums = [3,4,5,1,2]
输出:1
解释:原数组为 [1,2,3,4,5],旋转后最小值是 1。

示例 2:

复制代码
输入:nums = [4,5,6,7,0,1,2]
输出:0

示例 3:

复制代码
输入:nums = [11,13,15,17]
输出:11
解释:数组未旋转或旋转点为首元素。

提示:

  • n == nums.length
  • 1 <= n <= 5000
  • -5000 <= nums[i] <= 5000
  • nums 中所有元素 互不相同
  • 设计时间复杂度为 O(log n) 的算法

2. 问题分析

对于一个升序排序数组旋转后,它由 两个递增的子数组 组成:第一个子数组的元素都大于第二个子数组的元素,且最小值是第二个子数组的第一个元素。例如,[4,5,6,7,0,1,2] 中,第一个子数组为 [4,5,6,7],第二个为 [0,1,2],最小值为 0

关键点在于:

  • 如果数组未旋转(或旋转点在首元素),最小值是第一个元素。
  • 由于数组部分有序,可以利用 二分查找 来优化搜索,避免 O(n) 的遍历。

3. 解题思路

3.1 思路一:暴力遍历法

直接遍历整个数组,维护一个变量记录最小值。时间复杂度 O(n),空间复杂度 O(1)。简单但未利用数组特性,不是最优解。

3.2 思路二:二分查找法(最优解)

利用数组的 部分有序性,通过比较中间元素和右端点元素,判断最小值所在区间:

  • 如果 nums[mid] > nums[right]:最小值在右半部分(因为右半部分是更小的子数组),搜索区间更新为 [mid + 1, right]
  • 否则:最小值在左半部分或 mid 处,搜索区间更新为 [left, mid]

这个过程将时间复杂度降至 O(log n),空间复杂度 O(1),是最优解。

4. 各思路代码实现

4.1 暴力遍历法实现

javascript 复制代码
function findMin(nums) {
    let min = nums[0];
    for (let i = 1; i < nums.length; i++) {
        if (nums[i] < min) {
            min = nums[i];
        }
    }
    return min;
}

4.2 二分查找法实现

javascript 复制代码
function findMin(nums) {
    let left = 0;
    let right = nums.length - 1;
    while (left < right) {
        let mid = Math.floor((left + right) / 2);
        if (nums[mid] > nums[right]) {
            // 最小值在右半部分
            left = mid + 1;
        } else {
            // 最小值在左半部分或 mid 处
            right = mid;
        }
    }
    return nums[left]; // 当 left == right 时,找到最小值
}

5. 各实现思路的复杂度、优缺点对比表格

思路 时间复杂度 空间复杂度 优点 缺点
暴力遍历法 O(n) O(1) 代码简单易懂,适用于小数组或对性能要求不高的场景 未利用数组有序性,效率低,不满足 O(log n) 要求
二分查找法 O(log n) O(1) 高效,利用部分有序性,满足题目要求 逻辑稍复杂,需注意边界条件

最优解总结:二分查找法在时间和空间上均最优,是解决此类旋转排序数组问题的标准方法。

相关推荐
2501_933513047 分钟前
关于一种计数的讨论、ARC212C Solution
算法
Wu_Dylan8 分钟前
智能体系列(二):规划(Planning):从 CoT、ToT 到动态采样与搜索
人工智能·算法
散峰而望14 分钟前
【算法竞赛】栈和 stack
开发语言·数据结构·c++·算法·leetcode·github·推荐算法
知乎的哥廷根数学学派15 分钟前
基于多尺度注意力机制融合连续小波变换与原型网络的滚动轴承小样本故障诊断方法(Pytorch)
网络·人工智能·pytorch·python·深度学习·算法·机器学习
蚊子码农20 分钟前
算法题解记录-208实现Trie前缀树
运维·服务器·算法
2301_8002561121 分钟前
【人工智能引论期末复习】第3章 搜索求解2 - 对抗搜索
人工智能·算法·深度优先
程序员小远27 分钟前
完整的项目测试方案流程
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
程序猿阿伟29 分钟前
《量子算法开发实战手册:Python全栈能力的落地指南》
python·算法·量子计算
wen__xvn32 分钟前
代码随想录算法训练营DAY13第六章 二叉树part01
数据结构
木子020433 分钟前
Java8集合list.parallelStream() 和 list.stream() 区别
数据结构·list