トピック:いくつかの要素の配列の先頭には、配列、我々は回転呼んで配列の最後に移動しました。ソートされた配列をアレイの出力最小回転要素の増分回転を入力します。例えば、配列{3,4,5,1,2}、{1,2,3,4,5}は最小のアレイの回転です。
問題解決のアイデア:
1、一度最初から最後までトラバース暴力的な解決策は、私たちは最小の要素を見つけることができ、複雑さはO(n)のですが、入力の回転配列の特性を利用していない、と確かにインタビュアーの要件を満たしていませんでした。
図2に示すように、アレイは、2つのサブアレイとして注文することができるバイナリ検索は、バイナリ検索が規則正しい配列に非常に有効であり、複雑さはO(LOGN)です。
特定の分析:
配列が配列の最初の要素に表示されなければならない最小値に等しくなった後1、配列の特性を分析するためには、2つの規則正しいアレイ、すべての以前の値は、配列の値よりも大きいです。
図2は、比較値を見つけるためにバイナリサーチを低減し、範囲を検索する中間値に依存します。最後の要素への2つのポインタ、最初の要素にindex1のポイント、INDEX2ポイントを提供します。中間要素は、特定の最小の要素indexMid後、次いで、以上ポイントINDEX1 indexMid要素を指摘している場合。要素が等しいか、要素がに指摘未満INDEX2 indexMidを指摘した場合、最小の要素はindexMid indexMidまたは尖った要素の前に必ずあります。この判断は、検索対象を絞り込むために継続するための条件を使用することです。
図3に示すように、終了条件:
最後の要素は、最終的なプリindex1のサブアレイを指すであろう、最初の要素は、それらの間の距離は1であり、サブアレイINDEX2指します。そして、それはポイントINDEX2最小の要素です。
4、特別な状況:
数を0に回転させると、つまり、昇順で唯一の配列があり、最初の要素は最小要素であるため、検索する必要がない今回。
多くの場合、見た目に遭遇した別の状況があり、状況は同じ要素を持つことです。たとえば、{1、0、1、1、1} {0、1、1、1、1}が回転されます。インデックス1は、INDEX2は、要素の値がこの最小判定時間が配置されていない、indexMid 1向けられ、それだけ順次トラバースする必要があります。
コードは以下の通りであります:
パブリック クラスソリューション{ パブリック 静的整数分(INT []配列){ IF(配列== NULL || Array.lengthと== 0である){ 戻り ヌル; } int型低= 0 ; int型高であるArray.lengthと= 1 ; INTロー= MID; // これは、それ自体であれば増加アレイ // このループに回転の配列記述されている場合 、一方(配列[低]> = 配列[高]){ IF(高、低== 1 ){ MID = ハイ; BREAK; } MID =(ハイ+低)/ 2 ; // 、同じ要素に高い、低い、中間点は、右アレイはデジタル繰り返すだけならば、シーケンシャルサーチ IF(配列[MID]を> = 配列[低]){ 低 = MID; } そう IF(配列[MID <= 配列[高]){ ハイ = MID; } } 戻り配列[MID]; } // シーケンシャルサーチ パブリック 静的 INT minInOrder(INT []配列) { INT分=配列[0 ]。 以下のために(int型 I = 1; I <Array.lengthと; iは++ ){ もし(配列[I] < 分){ 分 = 配列[i]は、 } } 戻り分。 } パブリック 静的 ボイドメイン(文字列[]引数){ INT []配列= {3,4,5,1,2 }。 整数結果 = 分(アレイ) System.out.println(結果)。 } }