码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Leetcode153. 寻找旋转排序数组中的最小值(无重复元素)


    力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

    已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 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) 的算法解决此问题。

    题解:

    力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

    代码如下:

    1. class Solution {
    2. public int findMin(int[] nums) {
    3. int left = 0, right = nums.length - 1;
    4. while(left < right) {
    5. int mid = left + (right - left) / 2;
    6. if(nums[mid] < nums[right]) {
    7. right = mid;
    8. }
    9. else{
    10. left = mid + 1;
    11. }
    12. }
    13. return nums[left];
    14. }
    15. }

    题目要求实现O(logn)O(log_n)O(logn​) 的算法,这里使用二分查找以利用数组的部分有序性质,这里我们不需要找到特定的target元素,而是只需要找到最小值元素。实际上只要我们的算法是在每一步都缩小一半的搜索空间,那本质上就是在执行二分查找,只不过这里执行的二分查找相对于传统的二分查找做了特殊的边界处理:

    1. 首先,我们定义两个指针 low 和 high,分别指向数组的开头和末尾。
    2. 然后,我们进入一个 while 循环,只要 low 不等于 high,循环就会继续。
    3. 在每次循环中,我们计算中间位置 pivot。我们将 nums[pivot](即中间元素)与 nums[high](即当前搜索空间的最后一个元素)进行比较。
      • 如果 nums[pivot] < nums[high],这意味着从 pivot 到 high 的元素是有序的,因此最小值不可能在这个范围内,我们将 high 移动到 pivot,从而缩小搜索空间。
      • 否则,即 nums[pivot] >=nums[high],这意味着最小值可能在 pivot 右侧,因此我们将 low 移动到 pivot + 1。
    4. 当 low == high 时,搜索空间只剩一个元素,这就是我们要找的最小元素。 虽然整个数组不是完全有序的,但通过利用旋转数组的特性,我们仍然可以使用二分查找来找到最小的元素。

    为什么将 high 移动到 pivot,而不是移动到pivot左侧?

    这个问题的答案在于,pivot 可能就是最小的元素。 如果我们将 high 移动到 pivot 左侧(即 high = pivot - 1),那么我们就会错过检查 pivot 元素是不是最小元素的机会,因为下一次循环中,我们不会再考虑 pivot 元素。 我们正在寻找旋转排序数组中的最小元素。旋转排序数组的特性是,所有在旋转点后的元素都比旋转点前的元素小。这意味着,如果 nums[pivot] < nums[high],那么 pivot 就有可能是最小元素,或者在其左侧。 因此,当 nums[pivot] < nums[high] 时,我们需要将 high 移动到 pivot,而不是 pivot - 1,以保证不会错过最小元素。

     

     二分查找:为什么左右不对称?只比较mid与right的原因(C++, Java, Python3):

    力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

  • 相关阅读:
    时间序列预测实战(十六)PyTorch实现GRU-FCN模型长期预测并可视化结果
    (原创)视频图像接口之eDP
    05-流媒体-摄像头采集YUV
    运动戴什么耳机好呢、值得信赖的运动耳机推荐
    一年一度的中秋节马上又要到了,给你的浏览器也来点氛围感吧
    java-net-php-python-jsp基于JavaWeb的医药公司销售系统的设计与实现计算机毕业设计程序
    Quarkus 集成 mailer 使用 easyexcel 发送表格邮件
    考研数据结构与算法(三)栈和队列
    从LLaMA-Factory项目认识微调
    【阿里AgentScope框架】多框架组合:AgentScope加LangChain,让你的开发效率直线上升
  • 原文地址:https://blog.csdn.net/neverSaynever_/article/details/132847695
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号