题目
Suppose an array sorted in ascending order 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.
Example 1:
Input: [1,3,5]
Output: 1
Example 2:
Input: [2,2,2,0,1]
Output: 0
Note:
This is a follow up problem to Find Minimum in Rotated Sorted Array.
Would allow duplicates affect the run-time complexity? How and why?
二分法
这题与剑指offer-旋转数组的最小数字python类似,元素可重复,不同是数组可能完全增序。
有元素重复时,二分查找没用了,必须得用顺序查找。
class Solution(object):
def findMin(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if not nums:
return 0
l = 0
r = len(nums)-1
mid = l
while nums[l]>=nums[r]:
if r-l == 1:
return nums[r]
mid = (l+r)//2
if nums[l] == nums[mid] and nums[mid] == nums[r]:
return self.getMin(nums,l,r)
if nums[l]<=nums[mid]:
l = mid
elif nums[l] >= nums[mid]:
r = mid
return nums[l]
def getMin(self,nums,l,r):
mmin = nums[l]
for i in range(l,r+1):
if nums[i] < mmin:
mmin = nums[i]
return mmin
移动指针
当有重复元素时,除了顺序查找,还可以移动指针。
如果端点值相等,则将左指针+1,右指针不动。
class Solution(object):
def findMin(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if not nums:
return 0
l = 0
r = len(nums)-1
mid = l
while l<r and nums[l]>=nums[r]:
mid = (l+r)//2
if nums[l]<nums[mid]:
l = mid+1
elif nums[l]> nums[mid]:
r = mid
else:
l +=1
return nums[l]