• LeetCode50天刷题计划第二季(Day 27 — 寻找旋转排序数组中的最小值(9.50- 11.20)


    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


    前言

    芜湖

    一、题目

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

    已知一个长度为 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) 的算法解决此问题。

    示例

    示例 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 原来是一个升序排序的数组,并进行了 1 至 n 次旋转

    二、思路

    首先,理解题意,旋转的意思是将数组最后一个元素提前到第一个,也就是说输入数组是一个阶段有序的数组,且只有两个升序的段,第一个小于首元素的元素就是分段的结点,也就是数组中的最小元素。因此,再不要求时间复杂度的情况下,直接遍历数组即可(O(n)),但需要时间复杂度为 O(log n)时,就很容易联想到二分查找了。二分查找的核心思想是通过对中间位置值的判断,舍弃前一半或后一半的数字,使数据量减半。
    设数组第一个元素为a0,最后一个元素为a-1;在本题中,可能会出现两种情况:一是序列有序(a0a-1),第二种情况可以向第一种情况转换。若是第二种情况,将中间位置(定位向下取整)的数值x与a0进行对比,若x>a0,丢掉前半段元素;若x

    三、代码

    class Solution:
        def findMin(self, nums: List[int]) -> int:
            left=0
            right=len(nums)-1 #边界指针
            while(1):
                #print(left,right)
                if(nums[left]>=nums[right]): #序列不递增
                    if(right==left+1 or right==left): #已经找到
                        return nums[right]
                    mid=(left+right)//2 #二分
                    if(nums[mid]>nums[left]):
                        left=mid
                    else:
                        right=mid
                else: #序列递增
                    return nums[left]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

  • 相关阅读:
    文件上传之图片马混淆绕过与条件竞争
    多数之和问题
    新款UI动态壁纸头像潮图小程序源码
    【SpringBoot】SpringBoot自定义banner,成千上万种可供选择,当然也可以自定义生成哦
    UniApp百度人脸识别插件YL-FaceDetect
    一文了解 Java 中的构造器
    kfed修复损坏asm头部
    FDA食品级认证是什么?
    系统配置与性能评价>性能指标
    CountDownLatch源码分析
  • 原文地址:https://blog.csdn.net/weixin_46447549/article/details/127819263