题目:
假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 请找出其中最小的元素。 注意数组中可能存在重复的元素。
说明:
- 这道题是 寻找旋转排序数组中的最小值 的延伸题目。
- 允许重复会影响算法的时间复杂度吗?会如何影响,为什么?
思路:
仍然使用二分法,考虑到会存在重复元素的情况,因此当判断到有重复数字时(nums[middle] == nums[tail])时,使用tail--。
程序:
class Solution:
def findMin(self, nums: List[int]) -> int:
length = len(nums)
if length <= 0:
return 0
if length == 1:
return nums[0]
head = 0
tail = length - 1
while head < tail:
middle = (head + tail) // 2
if nums[middle] > nums[tail]:
head = middle + 1
elif nums[middle] < nums[tail]:
tail = middle
else:
tail -= 1
output = head
return nums[head]