题目描述:
· 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
解题思路:
首尾不相等时,用二分查找。
- Step1.和二分查找法一样,我们用两个指针分别指向数组的第一个元素和最后一个元素。
- Step2.接着我们可以找到数组中间的元素:
如果该中间元素位于前面的递增子数组,那么它应该大于或者等于第一个指针指向的元素。此时数组中最小的元素应该位于该中间元素的后面。我们可以把第一个指针指向该中间元素,这样可以缩小寻找的范围。移动之后的第一个指针仍然位于前面的递增子数组之中。如果中间元素位于后面的递增子数组,那么它应该小于或者等于第二个指针指向的元素。此时该数组中最小的元素应该位于该中间元素的前面。 - Step3.接下来我们再用更新之后的两个指针,重复做新一轮的查找。
首尾相等时,只能用顺序查找。
代码实现:
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
size_t low,high,mid;
high=rotateArray.size();
if(!high)
return 0;
high--;
low=0;
//首尾相等时暴力搜索
if(rotateArray[low] == rotateArray[high]){
for(int i=0;i<rotateArray.size()-1;i++){
if(rotateArray[i+1]<rotateArray[i]){
return rotateArray[i+1];
}
}
}
//首尾不等时二分搜索
while(low<high-1){
mid=(low+high)/2;
//如果中间数比末尾的数大
if(rotateArray[mid]>rotateArray[high]){
low=mid;
}
else{
high=mid;
}
}
return rotateArray[high];
}
};
网友评论