题目:
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.
题目来源:https://oj.leetcode.com/problems/find-minimum-in-rotated-sorted-array/
解题思路:找出中间元素如上例中的1,然后如果这个区间的首个元素比中间元素大,则最小元素必然在左半部分,如果末尾元素比中间元素小,则最小元素必然在后半部分,否则说明没有旋转,或者旋转位置为0,这样直接返回当前区间的第一个元素就是最小元素。
注意这里的循环停止条件是first==last或者first+1==last因为如果最后只剩下两个元素,则有可能会陷入死循环,如[2,1]此时mid=0,first=0,last=1,经过赋值以后三个变量都没有改变。
#include<iostream>
#include<vector>
using namespace std;
int findMin(vector<int> &num)
{
if(num.empty())
return 0;
int mid=0,first=0,last=num.size()-1;
while(first!=last && first+1!=last)
{
mid=first+((last-first)>>1);
if(num[first]>num[mid])
last=mid;
else if(num[mid]>num[last])
first=mid;
else
return num[first];
}
if(first==last)
return num[first];
else
return min(num[first+1],num[first]);
}
int main()
{
const int N=2;
int A[N]={1,2};
vector<int> num(A,A+N);
int result=findMin(num);
system("pause");
return 0;
}