题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
解:
class Solution {
public:int minNumberInRotateArray(vector<int> rotateArray) {
//周六 2017-6-17 坚持
//边界检查。数组大小.抛出异常
if(rotateArray.empty()) return 0;
// 初步思路:如果判断大小,找到分界点,然后移动。(如何移动到正确的位置)代价最小。
//正确思路:理解错了,应该是查找数组最小的元素。二分法。
//设两个指针指示。
int p1=0;//指向数组头
int p2=rotateArray.size()-1;//指向数组尾
int mid=p1;//二分法记住必要的中间点
//需要判断首尾大小关系?默认前面比后面大?
//首位比较
while(rotateArray[mid]>=rotateArray[p2])
{
//若只有两个数据时,就是最后一个数字。
if(p2-p1==1) return rotateArray[p2];
//p1向后移动?
//取中间的元素,比较大小
mid=(p1+p2)/2;
//若中间的元素大于等于最后的元素,首指针后移
if(rotateArray[mid]>=rotateArray[p2])
{
p1=mid;
}
//若中间的元素小于等于后面的元素,后面的指针前移
else if(rotateArray[mid]<=rotateArray[p2])
{
p2=mid;
}
}
return rotateArray[mid];
}
};