Description
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
分析
题目的意思是:给你一个rotated sorted array,然后找出里面的最小值,这道题相对于leetcode另一道hard题目简单一点,因为数组中不包含重复的数字。
- 核心思想还是二分搜索的方法,具体看代码,不理解的读者手动模拟一下就可以了。
C++
class Solution {
public:
int findMin(vector<int>& nums) {
int m=nums.size();
int low=0;
int high=m-1;
if(nums[low]>nums[high]){
while(low!=(high-1)){
int mid=(low+high)/2;
if(nums[low]<nums[mid]){
low=mid;
}else{
high=mid;
}
}
return min(nums[low],nums[high]);
}
return nums[0];
}
};
Python
最小值的可能如下图,mid可能出现在最小值的左边(low=mid+1),和最小值的右边,包含最小值位置的情况,所以high=mid。
class Solution:
def findMin(self, nums: List[int]) -> int:
# if nums[mid]<nums[high] high = mid else low = mid+1
low = 0
high = len(nums)-1
n = len(nums)
while low<high:
mid = (low+high)//2
if nums[mid]<nums[high]:
high = mid
else:
low = mid+1
return nums[low]
参考文献
[LeetCode] Find Minimum in Rotated Sorted Array 寻找旋转有序数组的最小值