题目描述:
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
请找出其中最小的元素。
你可以假设数组中不存在重复元素。
示例 1:
输入: [3,4,5,1,2]
输出: 1
示例 2:
输入: [4,5,6,7,0,1,2]
输出: 0
方法一、内置函数
拿到这个题目后的第一反应,是没太get到出题者的意图。因为无论怎么旋转,最小值永远都不会变。因此其实用暴力法、或者 **内置函数(min)**可以直接做,但我想这样就违背了出题者的意图。
code:
class Solution(object):
def findMin(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
return min(nums)
方法二、二分法
寻找数组中的最大最小值,算是二分法的经典运用了。当面试题对算法复杂度有要求时,应该往这方面考虑。
code:
class Solution:
def findMin(self, nums: List[int]) -> int:
left = 0
right = len(nums) - 1
while left < right:
mid = left + (right - left) // 2
if nums[right] < nums[mid]:
left = mid + 1
else:
right = mid
return nums[left]