返回

旋转数组中的最小值:揭秘LeetCode 154题

前端

寻找旋转数组中的最小值:二分查找的妙用

什么是旋转数组?

想象一个有序数组,它在某个位置被向右旋转了一定次数。这就是所谓的旋转数组。例如,数组 [1,2,3,4,5] 旋转一次后变成 [2,3,4,5,1],旋转两次后变成 [3,4,5,1,2]。

二分查找算法简介

二分查找算法是一种高效的搜索算法,它利用数组的有序特性来快速找到目标元素。它的工作原理如下:

  1. 从数组的中间元素开始比较。
  2. 如果目标元素比中间元素小,则搜索范围缩小到前半部分。
  3. 如果目标元素比中间元素大,则搜索范围缩小到后半部分。
  4. 重复上述步骤,直到找到目标元素或搜索范围为空。

寻找旋转数组中的最小值

要使用二分查找算法寻找旋转数组中的最小值,我们需要进行一些调整:

1. 确定旋转点

找出数组中第一个比其后一个元素大的元素。这个元素就是旋转点。旋转点之前的元素是旋转前的最大值,旋转点之后的元素是旋转后的最小值。

2. 二分查找

以旋转点为中点,将数组分为两部分。如果目标元素在左半部分,则左半部分是旋转后的有序数组;如果目标元素在右半部分,则右半部分是旋转后的有序数组。

3. 递归二分查找

在确定的有序部分内继续二分查找,直到找到目标元素或搜索范围为空。

代码示例

以下 Python 代码展示了如何寻找旋转数组中的最小值:

def find_min_in_rotated_array(nums):
  """
  Finds the minimum value in a rotated sorted array.

  Parameters:
    nums: A list of integers representing a rotated sorted array.

  Returns:
    The minimum value in the array.
  """

  # Find the rotation point.
  rotation_point = find_rotation_point(nums)

  # Perform binary search on the rotated portion of the array.
  left, right = rotation_point, len(nums) - 1
  while left <= right:
    mid = (left + right) // 2
    if nums[mid] > nums[right]:
      left = mid + 1
    else:
      right = mid - 1

  # Return the minimum value.
  return nums[left]


def find_rotation_point(nums):
  """
  Finds the rotation point in a rotated sorted array.

  Parameters:
    nums: A list of integers representing a rotated sorted array.

  Returns:
    The index of the rotation point.
  """

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

  return left

结论

使用二分查找算法寻找旋转数组中的最小值是一个经典算法问题,它要求同时运用逻辑思维和算法实现技巧。通过理解算法的原理和应用场景,你可以提高编程能力并解决更复杂的难题。

常见问题解答

1. 如何快速确定旋转点?

使用二分查找算法可以快速确定旋转点。从数组中间开始,比较中间元素和右端元素。如果中间元素大于右端元素,则旋转点在左半部分;否则,旋转点在右半部分。继续使用二分查找缩小搜索范围,直到找到旋转点。

2. 如果数组未旋转怎么办?

如果数组未旋转,则其已经是有序的。直接使用二分查找算法即可找到最小值。

3. 如果数组中有重复元素怎么办?

如果数组中有重复元素,使用二分查找算法寻找旋转点时可能会出现问题。一种解决方案是在比较元素时考虑相邻元素的顺序。

4. 算法的时间复杂度是多少?

算法的时间复杂度为 O(log n),其中 n 是数组的长度。

5. 还有其他方法可以找到旋转数组中的最小值吗?

除了二分查找算法之外,还可以使用线性搜索算法来找到旋转数组中的最小值。然而,线性搜索的时间复杂度为 O(n),比二分查找算法慢。