版权声明:本文为博主原创文章,欢迎转载!转载请保留原博客地址。 https://blog.csdn.net/grllery/article/details/89060796
文章目录
153. Find Minimum in Rotated Sorted Array
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
题目:旋转(有序)数组中的最小值,假设数组中无重复元素。
思路:二分查找,参见Compact and clean C++ solution。对于旋转数组[4,5,6,7,0,1,2]
而言,最小值落在后半段有序数组的首位。nums[start] > nums[end]
;对于mid = start + (end - start)/2
,如果nums[start] > nums[mid]
,说明mid
落在了后半段有序的数组中,那么最小值落在[start, mid]
之间,如果nums[start] < nums[mid]
,说明mid
落在了前半段有序的数组中,那么最小值在[mid, end]
之中。
class Solution {
public:
int findMin(vector<int>& nums) {
int r = nums.size() - 1;
int l = 0;
while(l < r){
if(nums[l] < nums[r]) //数组已经有序
return nums[l];
int mid = l + (r - l)/2;
if(nums[l] > nums[mid])
r = mid;
else
l = mid + 1;
}
return nums[l];
}
};
class Solution {
public:
int findMin(vector<int>& nums) {
int r = nums.size() - 1;
int l = 0;
while(l < r){
int mid = l + (r - l)/2;
if(nums[mid] > nums[r])
l = mid + 1;
else
r = mid;
}
return nums[l];
}
};
154. Find Minimum in Rotated Sorted Array II
如果数组中存在重复元素。
class Solution {
public:
int findMin(vector<int> &num) {
int lo = 0;
int hi = num.size() - 1;
int mid = 0;
while(lo < hi) {
mid = lo + (hi - lo) / 2;
if (num[mid] > num[hi]) {
lo = mid + 1;
}
else if (num[mid] < num[hi]) {
hi = mid;
}
else { // when num[mid] and num[hi] are same
hi--;
}
}
return num[lo];
}
};
When
num[mid] == num[hi]
, we couldn’t sure the position of minimum inmid
's left or right, so just let upper bound reduce one.