题目
假设按照升序排序的数组在预先未知的某个点上进行了旋转。例如,数组 [0,1,2,4,5,6,7]
可能变为 [4,5,6,7,0,1,2]
。
请找出其中最小的元素。
示例 1:
输入:nums = [3,4,5,1,2] 输出:1
示例 2:
输入:nums = [4,5,6,7,0,1,2] 输出:0
示例 3:
输入:nums = [1] 输出:1
解题
本题的意思就是 让你用二分查找去做。不用二分查找,那么这题就更加容易了。
方法一:二分查找
class Solution: def findMin(self, nums: List[int]) -> int: 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]
注意:if nums[mid] > nums[right]:
中的right不能替换成left。
如[4,5,6,7,0,1,2],如果nums[left]=0,nums[mid]=1,nums[mid]=2,就会出问题,因为这样就会输出结果2了。
if nums[mid] > nums[right]:
这种情况,如果mid的值为0、1、2、3,那么都是要left=mid+1的。
if nums[mid] > nums[left]:
这种情况,如果mid和left在同一个递增区间中,如[4,5,6,7]或[0,1,2]都会使得left=mid+1。
left, right = 0, len(nums) - 1 while left < right: mid = (left + right)//2 if nums[mid] > nums[left]: ### right换成left就不行了 left = mid + 1 else: right = mid return nums[left]
方法二:其他方法
class Solution: def findMin(self, nums: List[int]) -> int: nums.sort() return nums[0]
class Solution: def findMin(self, nums: List[int]) -> int: for i in range(len(nums)-1): if nums[i+1]<nums[i]: return nums[i+1] return nums[0]