problem
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.
详见Leetcode
Find Minimum in Rotated Sorted Array II
Follow up for “Find Minimum in Rotated Sorted Array”:
What if duplicates are allowed?
Would this affect the run-time complexity? How and why?
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.
详见Leetcode
Analysis
Find Minimum in Rotated Sorted Array
因为题目给出的序列是相对有序,所以我们依然可以采用二分搜索的方式来查找。首先判断当前中间的那个元素是否比我们现在所拥有的最小值小,如果是这样的话,更新最小值。然后判断现在搜索区间的中心元素是否比最后一个元素大,如果中心元素比最后一个元素大的话,说明最小值在后面的区间,否则,最小值将落在前半区间。判断后根据结果缩小搜索范围,一直到找到最小值为止。
Find Minimum in Rotated Sorted Array II
与上面的基础问题不同的是,当数组中出现重复元素的时候就不容易直接通过判断中间元素和最后的元素的大小来判断应该搜索哪一个空间,所以,如果两个元素相等的话,前后都需要搜索。
Complexity
Find Minimum in Rotated Sorted Array
时间复杂度:
O(log2n)
空间复杂度:
O(1)
Find Minimum in Rotated Sorted ArrayII
时间复杂度:最好情况是
O(log2n)
,最坏情况是
O(n)
空间复杂度:
O(1)
Code
Find Minimum in Rotated Sorted Array
class Solution {
public:
void biSearch(vector<int>& nums, int start, int end) {
int mid = (start+end) /2;
if (start>end) return;
if (nums[mid] < min) min = nums[mid];
if (nums[mid] > nums[end]) {
biSearch(nums,mid+1,end);
} else {
biSearch(nums,start,mid-1);
}
}
int findMin(vector<int>& nums) {
index = -1;
if (nums.size()!=0) min = nums[0];
else return -1;
biSearch(nums,0,nums.size()-1);
return min;
}
private:
int index;
int min;
};
Find Minimum in Rotated Sorted Array II
class Solution {
public:
void biSearch(vector<int>& nums, int start, int end) {
int mid = (start+end) /2;
if (start>end) return;
if (nums[mid] < min) min = nums[mid];
if (nums[mid] > nums[end]) {
biSearch(nums,mid+1,end);
} else if (nums[mid] < nums[end]){
biSearch(nums,start,mid-1);
} else {
biSearch(nums,mid+1,end);
biSearch(nums,start,mid-1);
}
}
int findMin(vector<int>& nums) {
index = -1;
if (nums.size()!=0) min = nums[0];
else return -1;
biSearch(nums,0,nums.size()-1);
return min;
}
private:
int index;
int min;
};