Find Minimum in Rotated Sorted Array
Suppose an array of length n
sorted in ascending order is rotated between 1
and n
times. For example, the array nums = [0,1,2,4,5,6,7]
might become:
[4,5,6,7,0,1,2]
if it was rotated4
times.[0,1,2,4,5,6,7]
if it was rotated7
times.
Notice that rotating an array [a[0], a[1], a[2], ..., a[n-1]]
1 time results in the array [a[n-1], a[0], a[1], a[2], ..., a[n-2]]
.
Given the sorted rotated array nums
of unique elements, return the minimum element of this array.
You must write an algorithm that runs in O(log n) time.
Example 1:
Input: nums = [3,4,5,1,2] Output: 1 Explanation: The original array was [1,2,3,4,5] rotated 3 times.
Example 2:
Input: nums = [4,5,6,7,0,1,2] Output: 0 Explanation: The original array was [0,1,2,4,5,6,7] and it was rotated 4 times.
Example 3:
Input: nums = [11,13,15,17] Output: 11 Explanation: The original array was [11,13,15,17] and it was rotated 4 times.
Constraints:
n == nums.length
1 <= n <= 5000
-5000 <= nums[i] <= 5000
- All the integers of
nums
are unique. nums
is sorted and rotated between1
andn
times.
answer
From the question, we can know that the given array is transformed from an increasing array through multiple rounds of rotate . Each round of rotate will[a[0], a[1], a[2], ..., a[n-1]]转化成[a[n-1], a[0], a[1], a[2], ..., a[n-2]]。
因此,经过多轮rotate后的数组nums一定有以下关系:nums[0]~nums[i]递增;nums[i+1]~nums[n-1]递增。因此想要找到数组nums的最小值,必须要找到下标i所在位置。题目要求时间复杂度为O(logn),我们可以利用二分法进行搜索。
The search plan is as follows:
while(l<=r){
mid=l+(r-l)/2;
if(nums[mid]<nums[mid-1]&&nums[mid]<nums[mid+1]){
return nums[mid];
}else{
if(nums[mid]>nums[n-1]){
l=mid+1;
}else{
r=mid-1;
}
}
}
Complete code
class Solution {
public:
int findMin(vector<int>& nums) {
// nums[i:j] ascending ; nums[j+1:n] ascending
int n=nums.size();
if(n==1){
return nums[0];
}else if(n<3){
return min(nums[0],nums[1]);
}
int l=1,r=n-2,mid,ans;
while(l<=r){
mid=l+(r-l)/2;
if(nums[mid]<nums[mid-1]&&nums[mid]<nums[mid+1]){
return nums[mid];
}else{
if(nums[mid]>nums[n-1]){
l=mid+1;
}else{
r=mid-1;
}
}
}
return min(nums[0],nums[n-1]);
}
};