返回

旋转数组的最小值

后端

前言

在计算机科学中,数组是一种常用的数据结构,用于存储同类型的数据项。数组的元素可以通过索引访问,索引是从 0 开始的整数。当数组中的元素按特定顺序排列时,称为排序数组。

旋转数组

旋转数组是一个经过循环移动的排序数组。换句话说,它是一个排序数组,其元素被向右或向左移动了任意数量的步长。例如,数组 [1, 2, 3, 4, 5] 可以旋转两次向右,得到 [3, 4, 5, 1, 2]。

寻找旋转数组的最小值

在一个旋转数组中,最小值可能不会出现在数组的开头。例如,在数组 [3, 4, 5, 1, 2] 中,最小值是 1,但它位于数组的末尾。

寻找旋转数组的最小值是一个常见的面试问题。解决此问题的算法需要利用数组已排序的事实。以下是一种有效的方法:

二分查找

二分查找是一种在有序数组中快速查找元素的算法。它通过反复将数组对半分来工作,每次都丢弃一半的元素。

对于旋转数组,二分查找算法需要进行一些修改。首先,我们需要找到旋转点,即数组中第一个元素小于最后一个元素的索引。然后,我们可以根据旋转点将数组分为两个子数组,并分别对它们应用二分查找算法。

算法步骤

  1. 初始化两个指针 leftright,分别指向数组的开头和结尾。
  2. 重复以下步骤,直到 left 指针大于或等于 right 指针:
    • 计算中点 mid
    • 如果 nums[mid] 大于 nums[right],则最小值一定在 [left, mid] 中。更新 rightmid - 1
    • 如果 nums[mid] 小于 nums[right],则最小值一定在 [mid + 1, right] 中。更新 leftmid + 1
  3. 返回 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刷题」公众号,第一时间获取算法刷题技巧。

公众号二维码