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] ,旋转 3 次得到输入数组。

示例 3:

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

编程思路

旋转会使数组变得无序,而最小值就在无序的区间中。而在有序的数组中,最左边就是最小值。

所有有把区间向无序区间收缩,直到缩小到区间变得有序,这时最左边就是最小值

python 复制代码
class Solution:
    def findMin(self, nums: List[int]) -> int:
        left = 0
        right = len(nums) - 1

        while left < right:
            mid = (left + right) // 2
            if nums[mid] >= nums[right]: #判断右边是否无序
                left = mid + 1 #如果无序,说明最小值在右边,把区间缩小到右边
            else:
                right = mid #否则缩小到左边
        
        return nums[left]
相关推荐
元亓亓亓15 小时前
LeetCode热题100--79. 单词搜索
算法·leetcode·职场和发展
司铭鸿16 小时前
化学式解析的算法之美:从原子计数到栈的巧妙运用
linux·运维·服务器·算法·动态规划·代理模式·哈希算法
ekprada16 小时前
DAY 18 推断聚类后簇的类型
算法·机器学习·支持向量机
生信大表哥16 小时前
Python单细胞分析-基于leiden算法的降维聚类
linux·python·算法·生信·数信院生信服务器·生信云服务器
玫瑰花店17 小时前
万字C++中锁机制和内存序详解
开发语言·c++·算法
靠沿17 小时前
Java数据结构初阶——LinkedList
java·开发语言·数据结构
Elias不吃糖18 小时前
LeetCode每日一练(209, 167)
数据结构·c++·算法·leetcode
铁手飞鹰18 小时前
单链表(C语言,手撕)
数据结构·c++·算法·c·单链表
悦悦子a啊18 小时前
项目案例作业(选做):使用文件改造已有信息系统
java·开发语言·算法
小殊小殊19 小时前
【论文笔记】知识蒸馏的全面综述
人工智能·算法·机器学习