class Solution:
def findMin(self, nums: List[int]) -> int:
res = nums[0]
for i in range(1, len(nums)):
res = min(res, nums[i])
return res
以下算法只对严格旋转(必须有断点,两段都升序,无重复,长度>2)序列有效,但对升序需要特殊处理(bug:对严格升序的序列,算法结果low=n-1)。 思路也很简单,即不断往断点处靠拢:
class Solution:
def findMin(self, nums) -> int:
n = len(nums)
left, right = 0, n - 1
if nums[n - 1] > nums[0]: # 若是升序
return nums[0]
while left <= right:
mid = left + (right - left) // 2
if nums[mid] >= nums[0]: # 在左分支
left = mid + 1
else: # 在右分支
right = mid - 1
# 结束时左断点为right,右断点为left
# 例外情况:若是升序,left会越界
if left > n - 1:
return nums[0]
else: # 否则等于右断点
return nums[left]