LeetCode 154 寻找旋转排序数组中的最小值 II 剑指Offer 11 旋转数组的最小数字 NC71 旋转数组的最小数字

这篇博客介绍了如何运用二分查找算法解决在可能存在重复元素的旋转数组中找到最小元素的问题。示例展示了当数组经过1到n次旋转后,如何通过优化的二分查找方法,在尽可能减少操作步骤的情况下找到最小值。文章提供了具体的Python代码实现,适用于处理旋转且可能含有重复元素的升序数组。
摘要由CSDN通过智能技术生成

BM21 旋转数组的最小数字

已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,4,4,5,6,7] 在变化后可能得到:
若旋转 4 次,则可以得到 [4,5,6,7,0,1,4]
若旋转 7 次,则可以得到 [0,1,4,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 ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。

你必须尽可能减少整个过程的操作步骤。

示例 1:

输入:nums = [1,3,5]
输出:1

示例 2:

输入:nums = [2,2,2,0,1]
输出:0

提示:

n == nums.length
1 <= n <= 5000
-5000 <= nums[i] <= 5000
nums 原来是一个升序排序的数组,并进行了 1 至 n 次旋转

进阶:这道题与 寻找旋转排序数组中的最小值 类似,但 nums 可能包含重复元素。允许重复会影响算法的时间复杂度吗?会如何影响,为什么?

解题思路:

二分查找

力扣

力扣

Python代码:

class Solution:
    def findMin(self, nums: List[int]) -> int:
        l, r = -1, len(nums)
        while l + 1 != r:
            if r == len(nums):
                target = nums[-1]
            else:
                target = nums[r]
            mid = l + (r - l) // 2            
            if nums[mid] > target:
                l = mid
            elif nums[mid] < target:
                r = mid
            else:
                r -= 1
        return nums[r]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值