返回

掌握思维地图,直击 LeetCode 153 寻找旋转排序数组中的最小值

闲谈

题目分析

首先,让我们拆解题目,了解其本质:

  • 问题
    给定一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次旋转后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7],经过一次旋转后,变成 [4,5,6,7,0,1,2]。
    我们需要找到旋转后的最小值。

  • 输入:

    • nums:一个长度为 n 的整数数组,代表旋转后的数组。
  • 输出:

    • 最小值:返回旋转后的数组的最小值。

思维导图解题思路

为了清晰地展现解题思路,我们采用思维导图的方式进行分析:

+----------------------------------------+
|                   LeetCode 153           |
+----------------------------------------+
              /           \
             /             \
        二分查找法      顺序查找法
              \             /
               \           /
               +-----------+
               | 复杂度高 |
               +-----------+

从思维导图中,我们可以看到两种解题思路:

  • 二分查找法:
    这种方法利用了旋转数组的特性,即旋转后的数组仍保留了部分递增序列。我们可以通过二分查找的方式来找到最小值,时间复杂度为 O(log n)。

  • 顺序查找法:
    这种方法简单粗暴,直接从数组的第一个元素开始逐个查找,直到找到最小值。时间复杂度为 O(n)。

从思维导图中,我们可以看到顺序查找法虽然实现简单,但效率低下,而二分查找法则能够在最坏情况下以 O(log n) 的时间复杂度找到最小值。

二分查找法的详细步骤

接下来,让我们详细讲解二分查找法的解题步骤:

  1. 初始化两个指针 leftright,分别指向数组的第一个元素和最后一个元素。
  2. 计算数组的中间元素索引 mid
  3. 比较 nums[mid]nums[left] 的大小:
    • 如果 nums[mid] 小于 nums[left], 则最小值在数组的左半部分,因此将 right 指针更新为 mid - 1
    • 如果 nums[mid] 大于 nums[left], 则最小值在数组的右半部分,因此将 left 指针更新为 mid + 1
  4. 重复步骤 2 和 3,直到 left 指针大于或等于 right 指针。
  5. 返回 nums[left],即旋转数组的最小值。

代码实现

以下是用 Python 实现的 LeetCode 153 寻找旋转排序数组中的最小值的代码:

def find_min(nums):
    left, right = 0, len(nums) - 1
    while left < right:
        mid = left + (right - left) // 2
        if nums[mid] > nums[right]:
            left = mid + 1
        else:
            right = mid
    return nums[left]

结语

通过思维导图的方式,我们清晰地展现了解决 LeetCode 153 寻找旋转排序数组中的最小值问题的两种思路,并详细讲解了二分查找法的解题步骤和代码实现。这种思维导图的方式不仅有助于您理解算法的核心思想,还可以帮助您快速理清解题思路,提高编程效率。