返回

逆风飞扬,剑指offer11,旋转数组的最小数字

闲谈

破题三问

  1. 何谓旋转数组?

旋转数组,顾名思义,是指将一个有序数组的若干个元素搬到数组末尾,形成一个新的数组,新数组仍然有序,但最小元素发生了改变。

  1. 如何找到旋转数组的最小数字?

寻找旋转数组的最小数字,可以用二分查找法,将数组分成两半,比较两半的最小值,如果左半部分的最小值大于右半部分的最小值,则最小值在右半部分,反之,则最小值在左半部分。重复这个过程,直到找到最小数字。

  1. 旋转数组的最小数字有什么应用场景?

旋转数组的最小数字在实际应用中很有用,比如在查找有序数组中的某个元素时,可以使用旋转数组的最小数字来优化二分查找法,从而提高查找效率。

独辟蹊径,二分寻宝

现在,我们来具体看看如何使用二分查找法找到旋转数组的最小数字。

  1. 初始化

首先,我们需要将数组分成两半,并找到两半的最小值。

  1. 比较

然后,我们比较两半的最小值,如果左半部分的最小值大于右半部分的最小值,则最小值在右半部分,反之,则最小值在左半部分。

  1. 递归

如果最小值在右半部分,则将右半部分作为新的数组,重复上述步骤。如果最小值在左半部分,则将左半部分作为新的数组,重复上述步骤。

  1. 终止

重复上述步骤,直到找到最小数字。

代码实现

def find_min_in_rotated_array(nums):
    """
    Find the minimum number in a rotated array.

    Args:
        nums: A list of numbers.

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

    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 nums[left]


# Test the function.
nums = [3, 4, 5, 1, 2]
print(find_min_in_rotated_array(nums))  # 1

应用场景

旋转数组的最小数字在实际应用中很有用,比如在查找有序数组中的某个元素时,可以使用旋转数组的最小数字来优化二分查找法,从而提高查找效率。

例如,在一个长度为100万的数组中查找某个元素,如果使用普通的二分查找法,需要比较50万次才能找到这个元素。但是,如果使用旋转数组的最小数字来优化二分查找法,只需要比较17次就能找到这个元素。