返回
旋转数组的最小值
后端
2023-12-04 09:36:23
前言
在计算机科学中,数组是一种常用的数据结构,用于存储同类型的数据项。数组的元素可以通过索引访问,索引是从 0 开始的整数。当数组中的元素按特定顺序排列时,称为排序数组。
旋转数组
旋转数组是一个经过循环移动的排序数组。换句话说,它是一个排序数组,其元素被向右或向左移动了任意数量的步长。例如,数组 [1, 2, 3, 4, 5] 可以旋转两次向右,得到 [3, 4, 5, 1, 2]。
寻找旋转数组的最小值
在一个旋转数组中,最小值可能不会出现在数组的开头。例如,在数组 [3, 4, 5, 1, 2] 中,最小值是 1,但它位于数组的末尾。
寻找旋转数组的最小值是一个常见的面试问题。解决此问题的算法需要利用数组已排序的事实。以下是一种有效的方法:
二分查找
二分查找是一种在有序数组中快速查找元素的算法。它通过反复将数组对半分来工作,每次都丢弃一半的元素。
对于旋转数组,二分查找算法需要进行一些修改。首先,我们需要找到旋转点,即数组中第一个元素小于最后一个元素的索引。然后,我们可以根据旋转点将数组分为两个子数组,并分别对它们应用二分查找算法。
算法步骤
- 初始化两个指针
left
和right
,分别指向数组的开头和结尾。 - 重复以下步骤,直到
left
指针大于或等于right
指针:- 计算中点
mid
。 - 如果
nums[mid]
大于nums[right]
,则最小值一定在[left, mid]
中。更新right
为mid - 1
。 - 如果
nums[mid]
小于nums[right]
,则最小值一定在[mid + 1, right]
中。更新left
为mid + 1
。
- 计算中点
- 返回
nums[left]
,因为它是最小值。
代码实现
def find_min_rotated_sorted_array(nums):
"""
找到旋转数组的最小值。
Args:
nums: 一个旋转的排序数组。
Returns:
数组中的最小值。
"""
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) // 2
if nums[mid] > nums[right]:
left = mid + 1
else:
right = mid - 1
return nums[left]
示例
nums = [3, 4, 5, 1, 2]
min_value = find_min_rotated_sorted_array(nums)
print(min_value) # 输出:1
结语
寻找旋转数组的最小值是一个重要的算法问题,在面试和实际应用程序中都有应用。通过利用二分查找算法并对算法进行一些修改,我们可以高效地解决这个问题。
扫码关注「LeetCode刷题」公众号,第一时间获取算法刷题技巧。
