问题描述:在153二分法的基础上,此题允许有重复元素出现。
题目链接:154. Find Minimum in Rotated Sorted Array II
这个题目需要克服的苦难就是有重复元素存在了,cheating的做法就是直接min()或者利用集合去重后二分,但是这其中的算法复杂度也是在线性时间了。肯定能AC~
看到讨论区里面有一个思路就是当比较的时候,元素相等只需要让中位数向后退(取决于你比较的位置最左还是最右)即可,不断前进不断比较。
代码实现如下:
class Solution(object):
def findMin(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if len(nums)==1:
return nums[-1]
mid = (len(nums)-1) // 2
# print(nums)
while(nums[mid]==nums[-1] and mid < len(nums) and ((mid+1) != len(nums)-1)):
mid += 1
if nums[mid] > nums[-1]: #证明中间有最小的
return self.findMin(nums[mid+1:])
else:
return self.findMin(nums[:mid+1])
class Solution(object):
def findMin(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
start = 0
end = len(nums) - 1
while(start < end):
mid = start + (end-start) / 2
if nums[mid] > nums[end]:
start = mid + 1
elif nums[mid]==nums[end]:
end -= 1
else:
end = mid
return nums[start]