返回
逆风飞扬,剑指offer11,旋转数组的最小数字
闲谈
2024-01-26 22:00:34
破题三问
- 何谓旋转数组?
旋转数组,顾名思义,是指将一个有序数组的若干个元素搬到数组末尾,形成一个新的数组,新数组仍然有序,但最小元素发生了改变。
- 如何找到旋转数组的最小数字?
寻找旋转数组的最小数字,可以用二分查找法,将数组分成两半,比较两半的最小值,如果左半部分的最小值大于右半部分的最小值,则最小值在右半部分,反之,则最小值在左半部分。重复这个过程,直到找到最小数字。
- 旋转数组的最小数字有什么应用场景?
旋转数组的最小数字在实际应用中很有用,比如在查找有序数组中的某个元素时,可以使用旋转数组的最小数字来优化二分查找法,从而提高查找效率。
独辟蹊径,二分寻宝
现在,我们来具体看看如何使用二分查找法找到旋转数组的最小数字。
- 初始化
首先,我们需要将数组分成两半,并找到两半的最小值。
- 比较
然后,我们比较两半的最小值,如果左半部分的最小值大于右半部分的最小值,则最小值在右半部分,反之,则最小值在左半部分。
- 递归
如果最小值在右半部分,则将右半部分作为新的数组,重复上述步骤。如果最小值在左半部分,则将左半部分作为新的数组,重复上述步骤。
- 终止
重复上述步骤,直到找到最小数字。
代码实现
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次就能找到这个元素。