返回
掌握思维地图,直击 LeetCode 153 寻找旋转排序数组中的最小值
闲谈
2024-02-12 13:43:09
题目分析
首先,让我们拆解题目,了解其本质:
-
问题
给定一个长度为 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) 的时间复杂度找到最小值。
二分查找法的详细步骤
接下来,让我们详细讲解二分查找法的解题步骤:
- 初始化两个指针
left
和right
,分别指向数组的第一个元素和最后一个元素。 - 计算数组的中间元素索引
mid
。 - 比较
nums[mid]
与nums[left]
的大小:- 如果
nums[mid]
小于nums[left]
, 则最小值在数组的左半部分,因此将right
指针更新为mid - 1
。 - 如果
nums[mid]
大于nums[left]
, 则最小值在数组的右半部分,因此将left
指针更新为mid + 1
。
- 如果
- 重复步骤 2 和 3,直到
left
指针大于或等于right
指针。 - 返回
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 寻找旋转排序数组中的最小值问题的两种思路,并详细讲解了二分查找法的解题步骤和代码实现。这种思维导图的方式不仅有助于您理解算法的核心思想,还可以帮助您快速理清解题思路,提高编程效率。