タイトル説明
いくつかの要素の配列の先頭には、配列、我々は回転呼んで配列の最後に移動しました。
出力回転最小の素子アレイの回転の入力配列の非降順。
例えば、配列{3,4,5,1,2}、{1,2,3,4,5}は最小のアレイの回転です。
注:配列のサイズは、リターン0 0である場合、すべての要素は、0よりも大きいに記載されています。
制限時間:C / C ++ 3秒、および他の言語6秒の
スペースの制限:C / C ++ 32M、64Mその他の言語
問題解決のためのアイデア
最も簡単な方法は:反復は、最初から最後まで、左側の要素の数は、配列要素の最小の要素と要素の右側の右側に要素を見られるよりも小さくなっています。
最適化、改良:
バイナリ検索:
同じアイデアや通常の二分法は、しかし半ば==高く、この場合に最も簡単な例(1,1,1,1,1,1)は、低中最小の要素を決定することができないとき、ことに留意すべきです-midまたは中高セグメントを、最初から最後まで一つ一つを発見するので、必要がありますが、これは確率が低い起こります。アルゴリズムの効率にほとんど影響。
ソース
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
int mid=0;
int low = 0 ;
int high = rotateArray.size() - 1;
while(low < high){
mid = (low + high) / 2;
if(rotateArray[mid] > rotateArray[high]){
low = mid + 1;
}else if(rotateArray[mid] == rotateArray[high]){
high = high - 1;
}else{
high = mid;
}
}
return rotateArray[low];
}
};