件名の説明:
あなたの正の整数アレイ与える A
(全く異なる要素でなくてもよい)は、最初の交換(2つの数の交換に戻ることができる A[i]
と A[j]
プレス辞書式順序は以下であるの後に得られた位置) A
最大の可能な構成。
あなたがように動作することができない場合は、元の配列に戻ってください。
例1:
入力:[3,2,1]
出力:[3,1,2]
説明:
交換機1と2
例2:
入力:[1,1,5]
出力:[1,1,5]
説明:
これは最小構成であります
例3:
入力:[1,9,4,6,7] 出力:[1,7,4,6,9] 説明: 交換機9と7
アイデア:
配列A(A.size()= N) 、後方に[i]は<a [i -1] iは(i>の最初のを見つける前に横断0、a)は、次の番号にインデックスiがN-1未満に見出される戻り、説明を調整する方法を見つけることができませんでし[I-1]の最大値max、インデックスiがN-1は、第1のスイッチングmaxの数に等しい、J、[j]を交換すると[I-1]。
C ++:
クラス解決{ パブリック: ベクトル < INT > prevPermOpt1(ベクトル< INT >&A){ 場合(A.size()== 1) を返します。 以下のために(int型 I = A.size() - 1 ; I> 0 ; i-- ){ 場合([i]が<A [I - 1 ]){ int型の最大値= A [i]は、 用(int型、J <A.size(); J = J ++ ){ 場合([J] <[I - 1] &&マックス<[J])MAX = A [J]。 } のための(int型 J = I; J <A.size(); J ++ ){ 場合([J] == max)は{ [j]は = [I - 1 ]。 [I - 1 ] = maxに。 返します。 } } } } を返します。 } }。
パイソン:
クラスのソリューション: DEF - >:prevPermOpt1(一覧の[int]は自己、A)一覧[INT]: 場合 lenは(A)== 1: リターンA 用 I における範囲(LEN(A)-1,0、-1 ) : もし [I] <A [I-1 ]: 最大値 = A [i]の ための J における範囲(I、LEN(A)): もし [J] <[I-1] 及び最大< [ J]: 最大 = A [J] のための J における範囲(I、LEN(A))。 場合は、[J] == 最大 :[j]は [I-1 = ] A [I -1] = 最大が 返すリターン Aを
C ++のランタイム提出以上の90.57パーセント、最速のソリューション112ms、コードされ、152ミリ秒:
クラス解決{ パブリック: ベクトル < INT > prevPermOpt1(ベクトル< INT >&A){ int型の長さ= A.size()。 場合(長さ<= 1 ){ 返します。 } int型フラグ= 偽。 int型 I = 1 ; int型のインデックス= - 1 ; 一方(iは< 長さ){ 場合([I] <[I - 1 ]){ インデックス = I -1 ; } 私は ++します; } もし(!インデックス= - 1 ){ int型 swapIndex =指数+ 1 。 INT maxTemp = A [インデックス+ 1 ]。 用(INT J =指数+ 1、J <長あり、j ++ ){ 場合([J] <[インデックス] && A [J]> maxTemp){ maxTemp = A [J]。 swapIndex = J; } } [swapIndex] =[インデックス]。 [インデックス] = maxTemp。 } を返します。 } }。