先来看154
Follow up for “Find Minimum in Rotated Sorted Array”:
What if duplicates are allowed?Would this affect the run-time complexity? How and why?
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7
might become 4 5 6 7 0 1 2
).
Find the minimum element.
The array may contain duplicates.
题目把已排好的序列移位了一下,然后让找最小值。
so,如果直接找最小值,复杂度是O(n)
class Solution(object):
def findMin(self, nums):
return min(nums)
显然,我们的目标是寻找更好的算法,显然第一个考虑的是二分查找。
我代码的要点:
- 第10行,每一次迭代都判断一下是否是排好序的,排好序的话就无需递归了
- 第16、17行,存在着相等的情况怎么处理,如【3,1,3,3,3】这里,先把第一个3去掉【1,3,3,3】就是排好序的了,输出第一个;再比如【3,3,3,1,3】,这里还是先去前面的3变成[3, 3, 1, 3],[3, 1, 3]到这里进入第14行,[3, 1]输出1
但是,写完一看由于存在可能重复的数,所以16、17行的存在,使得复杂度是O(n)的,即最差的情况是:所有的数都是一样的。
class Solution(object):
def findMin(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
high=len(nums)-1
low=0
while low<high:
if nums[low] < nums[high]:break
mid = (high + low)// 2
if nums[mid]>nums[low]:
low=mid+1
elif nums[mid]<nums[high]:
high=mid
elif nums[mid]==nums[low]:low+=1
else:high-=1
return nums[low]
做完这个再回看153,这里数是不允许重复的,我把处理可能的重复的两行注释掉,再加上一行 low=mid的情况(即只有两个数的情况即可)
class Solution(object):
def findMin(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
high=len(nums)-1
low=0
while low<high:
if nums[low] < nums[high]:break
mid = (high + low) // 2
if mid==low:return nums[high]
if nums[mid]>nums[low]:
low=mid+1
elif nums[mid]<nums[high]:
high=mid
#elif nums[mid]==nums[low]:low+=1
#else:high-=1
return nums[low]