📅  最后修改于: 2023-12-03 15:37:46.001000             🧑  作者: Mango
给定一个经过排序和旋转后的数组,找到该数组中最小的元素。
例如,原始数组 nums = [4,5,6,7,0,1,2],它最小元素为 0。
由于数组经过旋转后仍然是部分有序的,我们可以运用二分查找的思想,寻找旋转后的数组中的最小值。
具体思路如下:
如果数组为空,直接返回 0;
如果数组只有一个元素,则该元素就是最小值;
如果数组首个元素小于尾个元素,则说明数组未旋转,第一个元素即为最小值;
如果数组首个元素大于尾个元素,则说明数组被旋转过,定义两个指针 (left 和 right),分别指向数组首尾元素。
找到中间值 mid,如果 mid 大于 right 指向的值,则说明最小值在 mid 右边,移动 left 指针到 mid+1 处;
如果 mid 小于 right 指向的值,则说明最小值在 mid 左边或就是 mid,移动 right 指针到 mid 处。
继续对 left 和 right 指向的值进行判断,直到 left 和 right 重合,此时找到的元素即为最小元素。
返回最小元素即可。
代码进行了注释,便于理解:
class Solution:
def findMin(self, nums: List[int]) -> int:
# 数组为空,直接返回 0
if not nums:
return 0
# 数组只有一个元素,则该元素就是最小值
if len(nums) == 1:
return nums[0]
# 数组首个元素小于尾个元素,则说明数组未旋转,第一个元素即为最小值
if nums[0] < nums[-1]:
return nums[0]
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) // 2
# 找到最小值,返回
if nums[mid] > nums[mid + 1]:
return nums[mid + 1]
if nums[mid] < nums[mid - 1]:
return nums[mid]
# 如果 mid 大于 right 指向的值,则说明最小值在 mid 右边,移动 left 指针到 mid+1 处
if nums[mid] > nums[right]:
left = mid + 1
# 如果 mid 小于 right 指向的值,则说明最小值在 mid 左边或就是 mid,移动 right 指针到 mid 处
else:
right = mid - 1