題目描述
把一個數(shù)組最開始的若干個元素搬到數(shù)組的末尾,我們稱之為數(shù)組的旋轉(zhuǎn)围肥。
輸入一個非遞減排序的數(shù)組的一個旋轉(zhuǎn),輸出旋轉(zhuǎn)數(shù)組的最小元素。
例如數(shù)組{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉(zhuǎn)验靡,該數(shù)組的最小值為1。
NOTE:給出的所有元素都大于0吸占,若數(shù)組大小為0晴叨,請返回0凿宾。
問題分析
- 暴力查找
- 二分查找
解題思路1
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
int size = rotateArray.size();
if(size == 0){
return 0;
}//if
int left = 0,right = size - 1;
int mid = 0;
// rotateArray[left] >= rotateArray[right] 確保旋轉(zhuǎn)
while(rotateArray[left] >= rotateArray[right]){
// 分界點
if(right - left == 1){
mid = right;
break;
}//if
mid = left + (right - left) / 2;
// rotateArray[left] rotateArray[right] rotateArray[mid]三者相等
// 無法確定中間元素是屬于前面還是后面的遞增子數(shù)組
// 只能順序查找
if(rotateArray[left] == rotateArray[right] && rotateArray[left] == rotateArray[mid]){
return MinOrder(rotateArray,left,right);
}//if
// 中間元素位于前面的遞增子數(shù)組
// 此時最小元素位于中間元素的后面
if(rotateArray[mid] >= rotateArray[left]){
left = mid;
}//if
// 中間元素位于后面的遞增子數(shù)組
// 此時最小元素位于中間元素的前面
else{
right = mid;
}//else
}//while
return rotateArray[mid];
}
private:
// 順序?qū)ふ易钚≈? int MinOrder(vector<int> &num,int left,int right){
int result = num[left];
for(int i = left + 1;i < right;++i){
if(num[i] < result){
result = num[i];
}//if
}//for
return result;
}
};