news 2026/4/18 14:42:21

day126—二分查找—寻找旋转排序数组中的最小值(LeetCode-153)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
day126—二分查找—寻找旋转排序数组中的最小值(LeetCode-153)

题目描述

已知一个长度为n的数组,预先按照升序排列,经由1n旋转后,得到输入数组。例如,原数组nums = [0,1,2,4,5,6,7]在变化后可能得到:

  • 若旋转4次,则可以得到[4,5,6,7,0,1,2]
  • 若旋转7次,则可以得到[0,1,2,4,5,6,7]

注意,数组[a[0], a[1], a[2], ..., a[n-1]]旋转一次的结果为数组[a[n-1], a[0], a[1], a[2], ..., a[n-2]]

给你一个元素值互不相同的数组nums,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的最小元素

你必须设计一个时间复杂度为O(log n)的算法解决此问题。

示例 1:

输入:nums = [3,4,5,1,2]输出:1解释:原数组为 [1,2,3,4,5] ,旋转 3 次得到输入数组。

示例 2:

输入:nums = [4,5,6,7,0,1,2]输出:0解释:原数组为 [0,1,2,4,5,6,7] ,旋转 4 次得到输入数组。

示例 3:

输入:nums = [11,13,15,17]输出:11解释:原数组为 [11,13,15,17] ,旋转 4 次得到输入数组。

提示:

  • n == nums.length
  • 1 <= n <= 5000
  • -5000 <= nums[i] <= 5000
  • nums中的所有整数互不相同
  • nums原来是一个升序排序的数组,并进行了1n次旋转

解决方案:

代码逻辑拆解

  1. 边界初始化

    • len = nums.size():获取数组长度;
    • left = -1right = len - 1:延续「开区间(left, right)」的二分查找设计,初始查找范围是(-1, len-1),这种设计能避免处理数组首尾时的越界问题;
    • mid = 0:用于存储二分查找的中间索引。
  2. 二分循环条件

    • while(left + 1 < right):这是开区间二分的经典终止条件,保证(left, right)区间内还有至少一个元素可检查;当left + 1 == right时,区间内无剩余元素,循环终止。
  3. 核心的区间收缩逻辑(关键):旋转排序数组的核心特性是:数组被旋转后分成左右两个升序子数组,且左侧子数组的所有元素 ≥ 右侧子数组的所有元素,而nums[len-1]是右侧子数组的最后一个元素(也是右侧子数组的最大值)。基于此:

    • 计算中间位置mid = (left + right) / 2
    • nums[mid] < nums[len-1]:说明mid落在右侧的升序子数组(最小值所在的子数组),最小值一定在mid左侧(包括mid),因此将right = mid缩小区间;
    • 否则(nums[mid] ≥ nums[len-1]):说明mid落在左侧的升序子数组(数值更大的子数组),最小值一定在mid右侧,因此将left = mid缩小区间。
  4. 结果返回:循环结束时left + 1 == right,此时right恰好指向数组最小元素的索引,返回nums[right]即可得到最小值。

示例验证

nums = [4,5,6,1,2,3]为例:

  • 初始:left=-1right=5nums[5]=3);
  • 第一次循环:mid=2nums[2]=6 > 3left=2
  • 第二次循环:mid=3nums[3]=1 < 3right=3
  • 此时left+1=3 == right=3,循环终止,返回nums[3]=1(正确)。

总结

  1. 算法利用旋转排序数组的特性(最后一个元素区分左右升序子数组),通过二分查找将时间复杂度优化至O(log n)
  2. 「开区间(left, right)」的边界设计简化了边界处理,无需额外判断数组是否旋转;
  3. 核心判断条件是比较nums[mid]nums[len-1],以此确定最小值所在区间,最终right指向最小值索引。

函数源码:

class Solution { public: int findMin(vector<int>& nums) { int len=nums.size(); int right=len-1; int left=-1; int mid=0; while(left+1<right){ mid=(right+left)/2; if(nums[mid]<nums[len-1]){ right=mid; }else{ left=mid; } } return nums[right]; } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 8:38:44

多模态模型部署新选择|Qwen3-VL-WEBUI镜像全面解读

多模态模型部署新选择&#xff5c;Qwen3-VL-WEBUI镜像全面解读 随着多模态大模型在视觉理解、图文生成和跨模态推理等领域的持续突破&#xff0c;如何高效部署并快速验证其能力成为开发者关注的核心问题。阿里云推出的 Qwen3-VL-WEBUI 镜像为这一需求提供了开箱即用的解决方案…

作者头像 李华
网站建设 2026/4/18 8:30:09

从照片到3D:MiDaS教程

从照片到3D&#xff1a;MiDaS教程 1. 引言&#xff1a;AI 单目深度估计的现实意义 在计算机视觉领域&#xff0c;如何让机器“理解”三维空间一直是核心挑战之一。传统方法依赖双目摄像头或多传感器融合来获取深度信息&#xff0c;但这些方案成本高、部署复杂。近年来&#x…

作者头像 李华
网站建设 2026/4/18 10:08:27

Linux系统调用追踪与性能分析实战

前言 程序跑得慢&#xff0c;但不知道慢在哪。CPU不高、内存够用、磁盘IO也正常&#xff0c;可就是响应慢。这时候需要看系统调用&#xff08;syscall&#xff09;&#xff1a;程序到底在做什么&#xff1f;是频繁读写文件、网络IO阻塞&#xff0c;还是系统调用本身开销太大&am…

作者头像 李华
网站建设 2026/4/18 8:09:17

Qwen3-VL-WEBUI在企业级场景的应用:电商、医疗与金融案例

Qwen3-VL-WEBUI在企业级场景的应用&#xff1a;电商、医疗与金融案例 1. 模型概述与核心能力 Qwen3-VL-WEBUI 是基于阿里开源的 Qwen3-VL-4B-Instruct 视觉-语言模型构建的一站式交互平台。该镜像集成了完整的推理环境和可视化界面&#xff0c;支持图像理解、视频分析、GUI操…

作者头像 李华
网站建设 2026/4/18 4:05:35

避坑指南:分类模型环境配置5大雷区,云端方案全规避

避坑指南&#xff1a;分类模型环境配置5大雷区&#xff0c;云端方案全规避 引言 作为一名开发者&#xff0c;你是否经历过这样的崩溃时刻&#xff1a;为了跑通一个简单的分类模型&#xff0c;反复折腾conda环境却总是报错&#xff0c;重装系统三次依然无解&#xff1f;这种&q…

作者头像 李华
网站建设 2026/4/18 8:07:45

多模态模型微调新选择|Qwen3-VL-WEBUI实战分享

多模态模型微调新选择&#xff5c;Qwen3-VL-WEBUI实战分享 1. 引言&#xff1a;多模态微调的现实挑战与新机遇 随着大模型从纯文本向多模态&#xff08;视觉-语言&#xff09; 演进&#xff0c;如何高效地对视觉语言模型&#xff08;VLM&#xff09;进行定制化微调&#xff0…

作者头像 李华