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.
You may assume no duplicate exists in the array.
Example 1:
Input: [3,4,5,1,2]
Output: 1
Example 2:
Input: [4,5,6,7,0,1,2]
Output: 0
Accepted
311,542
Submissions
717,092
--------------------------------------------------------------------------------------------------
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
--------------------------------------------------------------------------------------------------------
不管重复不重复,都利用(如何写一个正确的二分法代码_taoqick的博客-优快云博客)的二分写法。和传统写法不同的是,由于这里是找最小,所以nums[mid]==nums[r]时可以放心大胆的把nums[r]扔掉(这里也解释了为啥不用nums[l]和nums[mid],因为nums[l]<nums[mid]的时候,这时候只能说明左边一定没坑,但并不能说明右边一定有坑,这时候丢掉左边或者右边都是不对的,这就是左右的区别!)。同时要注意nums[mid]<nums[r]的时候,nums[mid]有可能是最小(例如[3,1,3]),所以把一边的跨步移动r=mid-1改成r=mid,另外一边仍然跨步移动,就不会陷入死循环。
但是注意这种方式,找到的是最小值,但并不一定是最大和最小的分界线。例如[1,1,3,1],上来就会把最右边的1给扔掉,因此找分界线更难!!!
class Solution:
def findMin(self, nums: List[int]) -> int:
l,r = 0,len(nums)-1
while (l <= r):
mid = l+((r-l)>>1)
if (nums[mid] < nums[r]):
r = mid
elif (nums[mid] > nums[r]):
l = mid+1
else:
r-=1
return nums[l]