問題:(すべての要素が0より大きい与えられた)配列の配列、我々は回転呼ん配列の末尾に移動し、いくつかの要素の始まり。
注:配列サイズが0の場合、0を返します。
入力:配列<整数>アレイの非降順の回転ベクトル
出力:最小回転素子アレイ。
アイデア::順次検索した場合、時間計算量はO(n)は、次のようにバイナリ検索に基づいて複雑性O(LOGN)アルゴリズムの程度は、特にアイデアがある時間を紹介
頭と尾配列の先頭を指し、二つのポインタの値index1とINDEX2を確立します。
A。配列は配列[index1の<配列[INDEX2]は、回転が経過していないことを示しているが、結果は直接に出力配列[index1の】非降順であるため。
B。配列[index1の]> =配列[INDEX2]、要素が直接アレイを取って、最小値を見つけることができない[(index1の+ INDEX2)/ 2]頭と尾と比べ。
B.1。絞り込み処理、INDEX2-index1の== 1、次いでINDEX2を返す。場合、または(配列[index1の] ==配列[INDEX2])&&(配列[index1の] ==配列[(index1ので+ INDEX2)/ 2])は、順次検索にのみスイッチを、見つけるために、二分法を使用することはできません
B.2。配列[index1の<=配列[(index1の+ INDEX2)/ 2]、右半分の最小数は、index1の(index1の+ INDEX2)/ 2に割り当てられている場合
B.3。配列[INDEX2]> =配列[(index1の+ INDEX2)/ 2]、INDEX2に割り当てられた左半分の最小数、(index1の+ INDEX2)/ 2の場合
コード:
class Solution {
public:
int minNumberInRotateArray_SequenceFind(vector<int> array)
{
int result=array[0];
int length=array.size();
for(int i=1;i<length;i++)
{
if(array[i]<result)
result=array[i];
}
return result;
}
int minNumberInRotateArray(vector<int> rotateArray) {
if(rotateArray.empty())
return 0;
int length=rotateArray.size();
int index1=0;
int index2=length-1;
int midIndex=index1;
while(rotateArray[index1]>=rotateArray[index2])
{
if((index2-index1)==1)
return rotateArray[index2];
midIndex=(index2+index1)/2;
if((rotateArray[index1]==rotateArray[index2])&&(rotateArray[index1]==rotateArray[midIndex]))
return minNumberInRotateArray_SequenceFind(rotateArray);
if(rotateArray[index1]<=rotateArray[midIndex])
index1 = midIndex;
else if(rotateArray[index2]>=rotateArray[midIndex])
index2 = midIndex;
}
return rotateArray[midIndex];
}
};
複雑分析: O(N)の時間計算量は、空間的複雑度はO(1)です。