AcWing 22 旋转数组的最小数字
发布日期:2021-05-28 16:30:13 浏览次数:21 分类:精选文章

本文共 1044 字,大约阅读时间需要 3 分钟。

为了解决这个问题,我们需要找到一个旋转数组的最小值。尽管旋转数组可能带有重复元素,但我们可以利用二分查找的方法来高效地解决这个问题。

方法思路

  • 去除重复元素:首先从数组末尾除去与首元素不同的重复元素。这样可以简化后续的二分查找过程。
  • 确定最小值:比较处理后的末尾元素和首元素的大小。若末尾元素为最终最小值,则直接返回;否则,使用二分查找在处理后的数组中找到最小值。
  • 这种方法的时间复杂度主要取决于二分查找的时间复杂度,通常为 O(log n),其中 n 是数组的长度。这使得该方法在处理大量数据时非常高效。

    解决代码

    class Solution:    def findMin(self, nums):        if not nums:            return -1        # 去掉末尾重复元素        n = len(nums) - 1        while n > 0 and nums[n] == nums[0]:            n -= 1        # 确定最小值在哪里        if nums[n] >= nums[0]:            return nums[0]        else:            min_val = nums[n]            # 二分查找            low = 0            high = n            while low < high:                mid = low + (high - low) // 2                if nums[mid] <= nums[0]:                    high = mid                else:                    low = mid + 1            return nums[low]

    代码解释

  • 初始检查:首先检查数组是否为空,若为空则返回 -1。
  • 去除末尾重复元素:从数组末尾开始,逐步移动到找到第一个与首元素不同的位置。
  • 确定最小值位置:比较末尾处理后的元素与首元素的大小。如果末尾元素更小,则作为最小值,否则继续二分查找。
  • 二分查找最小值:使用二分法确定最小值的位置,逐步缩小搜索范围,直到找到最小值。
  • 这种方法确保了在处理重复元素的情况下,也能高效地找到旋转数组的最小值。

    上一篇:AcWing 23 矩阵中的路径
    下一篇:AcWing 21 斐波那契数列

    发表评论

    最新留言

    路过按个爪印,很不错,赞一个!
    [***.219.124.196]2025年05月05日 06时45分21秒