news 2026/4/16 11:07:52

leetcode二分——153. 寻找旋转排序数组中的最小值

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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次旋转

大概思路

我想的是这道题一般情景下就是会遇到两种情况:一是该数组本身就没有被旋转就是一个递增的情况,这种情况下最小值就是第一个数组元素,第二种应该是大多数情况,发生了一定量的旋转,而最小值就在数组中间,比如4、5、6、7、1、2、3这样的。分析一下这种情况,这种情况下一定是最小数的左边有一个递增序列,其右边有一个递增序列,并且左边序列的每一个值都比右边最大的数还大,因此我们可以以右边序列最大的数为基准去和二分产生的中间数进行对比,最右边的数记作m当nums[mid]>m时,说明mid所处位置在左边的递增序列,最小数在mid的右边,此时更新left=mid+1。反过来,如果nums[mid]<m时,mid处在右边的递增序列上(右边递增序列的每一个数小于m),那么最小数在mid左边,所以更新right=mid-1,这样让left和right逐渐靠近,包裹住我们要找的最小数,最终二分终止后得到的就是最小数。

其实大致的思路是容易确定的,主要是我们最终条件终止时得到的究竟是最小数么,是left还是right呢,还有就是有几种特殊情况,我刚才分析的是第二种情况下的结果,对于第一种情况这个算法成立么,还有就是假如最右边恰好是最小数比如4、5、6、7、1,这种情况算法正确吗。

我是怎么确定二分的返回值和判断条件的:

怎么确定返回值是left还是right或者其他?

最终到底是left是答案还是right,我是通过所有情况分析再给出结论的,首先对于一般的数组比如....4、5、6、7、1、2、3....,那么在用二分时基于我们的判断条件可以想象这个数组左右两边的省略号出现的数可能不一样,可是mid无非出现在7的左侧和2的右侧或7和2的某个数或者1上面吧。

假如mid直接一开始就指向了1,那么1<m,所以right=mid-1,指向7,此时left和right中间都是比m大的数了,left会不断靠近right,而right定在7上了,直到left变成7,判断mid指向7,7>m,所以left指向1,二分结束,left指向1,此时left指向最小值。

假如mid没直接指向1,而是先指向了7或2,比如7,那么left会更新指向1,此时right不断向左靠近,直到mid又变成了指向1。最后结果和上面一样的,left最终指向最小值。那么假如mid指向了2,right会更新为1,此时left会不断向右靠近,直到left指向7,mid指向7,然后更新left指向1,此时mid又指向1,结果同上,left最终指向最小值。

假如mid没有先指向1,或者指向7和2,那么最终也会落到这些数上面,重复归到上面来考虑。至此,说明left最后都指向最小值。

特殊情况?

特殊情况有两个,一个是数组完全严格递增,那么这种情况下right不断向左靠近,直到条件终止二分,left的位置始终为最小值位置。也成立

另外一个是right一开始指向的就是最小值,比如3、4、5、6、1,这种情况下,推演一下,left一直往右靠近,直到left==right,然后这里会出现nums[mid]==m的特殊情况,所以这里为了保证left仍是最终答案,我将这一个情况合并到了nums[mid]<m,这样更新right后,left仍是答案,同时由于right<left,我们跳出了二分循环。这一处代码中的体现就是else{ r=mid-1; }

其他情况下,根本判断不到nums[mid]==m这种情况,因为这道题是数组元素不重复,只要right不在一开始指向最小值,mid就不会指向m。

复杂度

  • 时间复杂度: O(logN)
  • 空间复杂度: O(1)

我对二分的条件分析和返回值分析总是比较复杂和费时,希望各位在思考上如果有更简单的想法和思路可以告诉我。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 20:19:39

二十年“架骨注魂”的旅程

摘要 数字化转型的成功&#xff0c;不取决于技术的先进与否&#xff0c;而取决于管理思想&#xff08;血肉灵魂&#xff09; 与数字系统&#xff08;骨骼架构&#xff09; 能否在互动中相互塑造&#xff0c;形成具有自适应能力的 “数字共生体” 。 本系列旨在为这场深刻变革提…

作者头像 李华
网站建设 2026/4/13 16:24:12

如何处理 React 中事件处理程序的绑定问题

如何处理 React 中事件处理程序的绑定问题 —— 从「this 丢失」到「性能飙红」的实战手册 一句话总结&#xff1a;用「箭头函数 useCallback 传参模板」三件套&#xff0c;让事件绑定既安全又高性能&#xff01; 一、为什么要「处理」事件绑定&#xff1f; React 事件绑定…

作者头像 李华
网站建设 2026/4/15 22:13:11

论文降重 + 去 AIGC 双 buff!虎贲等考 AI 让学术合规率飙升 98%

“查重率 35% 改到崩溃&#xff0c;越改逻辑越乱”“AI 写的初稿被检测出 AIGC 痕迹&#xff0c;直接打回重写”“降重只换同义词&#xff0c;导师批‘学术性丧失’”—— 论文写作的最后一道坎&#xff0c;往往是 “降重” 与 “去 AIGC 痕迹”。很多人陷入 “降重 改字”“去…

作者头像 李华
网站建设 2026/4/16 10:41:16

HoloOcean水下机器人模拟器:从1.0到2.0的重大升级

随着水下机器人技术的快速发展&#xff0c;高保真仿真平台已成为算法开发、系统验证和任务预演的关键工具。HoloOcean 作为一款基于游戏引擎构建的开源水下机器人模拟器&#xff0c;自2022年发布以来&#xff0c;已成为学术界和工业界的重要工具。近日&#xff0c;其开发团队发…

作者头像 李华
网站建设 2026/4/11 15:23:55

Python计算机毕设之基于python养老社区的查询预约系统养老服务预约系统(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华