1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
パブリック クラス { 公共のint minNumberInRotateArray (INT []配列) { int型のインデックス1 = 0。int型 INDEX2 = Array.lengthと- 1。int型 indexMid = 0 ;
もし(Array.lengthと== 0){ 戻り0 ; }
一方、(配列[index1の]> =配列[INDEX2]){ 場合(INDEX2 - == index1の1){ indexMid = INDEX2。破ります ; }
indexMid =(index1の+ INDEX2)/ 2。
あれば(配列[index1の] ==配列[indexMid] &&配列[indexMid] ==配列[INDEX2]){ 戻り minSequentialSearch(アレイ)。 }
もし(配列[indexMid]> =配列[index1の]){ index1の= indexMid。 } そう であれば(配列[indexMid <=配列[INDEX2]){ INDEX2 = indexMid。 } }
リターン・アレイ[indexMid]。 }
プライベート INT minSequentialSearch (INT []配列) { int型 indexMin = 0。以下のために( int型 I = 1 ; I <Array.lengthと; iは++){もし(配列[I] <配列[indexMin]){ indexMin = I。 } }
リターン・アレイ[indexMin]。 } }
|
時間複雑
時間の複雑さは、対数レベルの$ O(logN個)$です。
解決策2 [Javaの]:時間複雑性の$ O(N / 2)$
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
パブリック クラス { 公共のint minNumberInRotateArray (INT []配列) { 場合(Array.lengthと== 0){ 戻り0 ; }
INT分=配列[ 0 ]。
以下のために(int型 I = 1 ; I <Array.lengthと; ++ I){ もし(配列[I] <分){ 戻り配列[i]は、 } }
戻り分。 } }
|
考え
回転後、常に数字のセットを見つける二つの隣接する数字の右の比較左から、最初の数は、第二の数が最小である、第二の数よりも大きいです。秒数であるため、操作のすべての後続の回転数は、一連の数字の最後に移動します。
オリジナル:ビッグボックスは 安全性11に配列オファーを回転の最小数を証明します