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.
#include <iostream>
#include <vector>
#include <math.h>
#define min(A,B) (A>B?B:A)
using namespace std;
int findMinSub(vector<int> &num,int begin,int end)
{
if(begin >= end)
return INT_MAX;
if(end == begin + 1)
return num[begin];
if(end == begin + 2)
return min(num[begin],num[begin+1]);
if(num[begin] < num[end-1])
return num[begin];
int mid = num[(begin+end)/2];
int minVal = INT_MAX;
if(num[begin] < mid)
{
minVal = num[begin];
return min(minVal,findMinSub(num,(begin+end)/2+1,end));
}else if(mid < num[end-1])
{
minVal = mid;
return min(minVal,findMinSub(num,begin,(begin+end)/2));
}
}
int findMin(vector<int> &num) {
int len = num.size();
return findMinSub(num,0,len);
}
int main(void)
{
vector<int> num;
num.push_back(5);
num.push_back(1);
num.push_back(2);
num.push_back(3);
cout <<findMin(num) << endl;
system("pause");
return 0;
}