news 2026/3/2 14:41:02

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/2/24 22:13:57

全网最全 10个降AI率工具测评:专科生降AI率必备指南

在当前高校教育中&#xff0c;AI写作工具的广泛应用让论文创作变得更加高效&#xff0c;但也带来了AIGC率偏高的问题。尤其是对于专科生来说&#xff0c;如何在保证论文质量的同时有效降低AI痕迹和查重率&#xff0c;成为了一个亟需解决的难题。这时候&#xff0c;AI降重工具就…

作者头像 李华
网站建设 2026/3/1 14:11:35

8吨机动绞磨

长云科技响箭8号柴油款机动绞磨机专为严苛的无电力供应环境设计&#xff0c;其核心采用柴油机动力&#xff0c;扭矩强劲且运行稳定&#xff0c;为山区、野外等复杂地形的重型牵引作业提供了可靠的安全保障。 其搭载柴油机动力&#xff0c;额定牵引力高达80KN&#xff0c;扭矩强…

作者头像 李华
网站建设 2026/3/1 9:45:53

当我决定把家安在凤五:一位改善者的选房心路

每一次决定换房&#xff0c;都像是对未来生活的一次郑重投票。在西安看了大半年房子&#xff0c;从新区看到主城&#xff0c;从概念看到实景&#xff0c;最终让我停下脚步的&#xff0c;是招商林屿缦岛。这篇文字&#xff0c;想从一个普通购房者的角度&#xff0c;聊聊我看到的…

作者头像 李华
网站建设 2026/2/24 7:35:30

2026 论文写作工具红黑榜:AI 软件怎么选?一篇讲透

红榜优先选毕业之家、PaperRed、豆包&#xff0c;适配国内学术规范&#xff1b;黑榜避开低质免费工具、无真实引用平台、过度依赖全文生成的工具&#xff0c;优先按需求匹配三维模型&#xff08;需求匹配度 - 数据可信度 - 成本承受力&#xff09;。 一、红榜&#xff1a;10 款…

作者头像 李华
网站建设 2026/2/28 0:48:01

9 款 AI 写论文哪个好?实测后这款毕业论文神器凭硬实力出圈

毕业季选 AI 写论文工具&#xff0c;堪比 “大海捞针”—— 有的文献虚构无法溯源&#xff0c;有的生成内容空洞无数据支撑&#xff0c;有的只能简单润色没实质帮助。为帮大家避坑&#xff0c;我们实测了 9 款主流 AI 写论文工具&#xff08;Aibiye、Aicheck、Askpaper、OpenAI…

作者头像 李华
网站建设 2026/2/26 13:24:51

虎贲等考 AI:以 AI 重构学术创作,全流程赋能论文写作新范式

在学术探索的道路上&#xff0c;无数学生与科研工作者曾深陷选题迷茫、文献繁杂、数据空洞、查重反复的困境。传统论文写作中&#xff0c;工具功能碎片化、素材真实性难保障、全流程衔接不畅等问题&#xff0c;严重消耗着创作精力。虎贲等考 AI 智能写作平台&#xff08;官网&a…

作者头像 李华