Suppose a sorted array 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.
[Analysis]
Simple solution is to experiment linear search and the time complexity is O(N).
It is noticeable that the pivot at position i must meet the following condition: A[i-1]>A[i] and A[i]<A[i+1] (if rotation happened). For example, "0" in above array. So we can apply binary search in this case. Time complexity is O(lg N).
A follow-up question can be, find a given value in such array. The first step will be find the pivot. Then the second step is to apply binary search again for the given value.
[Solution]
int findMin(vector<int> &num) {
if (num.size()==0) return 0;
if (num.size()==1 || num[0]<num.back()) return num[0];
if (num.size()==2) return min (num[0], num[1]);
int mid = num.size()/2;
if (num[mid]<num[mid+1] && num[mid]<num[mid-1]) return num[mid];
vector<int> split;
if (num[mid]>num.back()) {
split = vector<int> (num.begin()+mid, num.end());
} else {
split = vector<int> (num.begin(), num.begin()+mid);
}
if (num[mid]>num.back()) {
split = vector<int> (num.begin()+mid, num.end());
} else {
split = vector<int> (num.begin(), num.begin()+mid);
}
return findMin(split);
}
}
No comments:
Post a Comment