このコードは、彼らの個人的な理解のうえ、Leetcode正式タイトルから来て、よりよく理解するために読者を有効にするために、独自のノートを生成します。侵害した場合、すぐにそれを削除します!
パブリック クラスMain31 { 公共 静的 ボイドメイン(文字列[]引数){ INT [] = ARR 新しい新規 のint [] {9 ,. 5 ,. 3 ,. 1。}; nextPermutation(ARR); } / ** *核となるアイデアは:考えます降順は次の高次を有していなくてもよい。 *まずスキャン[I-1] < [i]は、所与のアレイの右側から、(コア思想に反して、プロセス) 2. * [I-1]固定位置、最初の[I-1]多数[J]見つけるよりも右側(右から左)、 * 3交換[Iを-1]と[j]の値。交換比べ多数からなる第1の最後の番号の右側に[I-1]ではない前に、この時点では、[I-1]、次に高い要素の最初の位置である * 4。 [I-1]右(前降順、昇順)再配置最小であり、この場合には、元の数が数よりも多い数で構成されている; * @param NUMS * / パブリック 静的 ボイド nextPermutation(INT [] NUMS){ int型 I = -nums.length 1; // インデックスの最後から二番目の要素 一方(I-1> = 0 && NUMS [I] <= NUMS [-I 1。]){ / * OK NUMS [I-1]の位置、すなわちNUMS [I-1] <NUMS [i]は、 I-1は、簡略化された位置を決定する* / Iを - ; } IF(I-1> = 0){ / * もし私はまた、アレイの位置、すなわちNUMS [i]は<iは+ 1] NUMS * / / * iが配列されていない下降アレイ、直接反転は列の最小数にせ遭遇* / INT J NUMSを=を。 1長; / * iはゾーンの右端Jの右側に位置する/ * ながら([1-I] J> = 0 && NUMS [J] <= NUMS){ / * 第NUMS [j]を見つけます。 NUMSより大きい倍[I-1]の位置、この時刻jも(確かに配列jにおける、もちろん)アレイで満たす* / J- ; / * J停止位置は、第1の位置NUMSより大きい[I-1]、前記* / } スワップ(NUMS ,. 1-I、J); / * 交換NUMS [I-1]、NUMS [ 値j]がある* / } リバース(NUMS、I); / * 昇順に、降順でIの権利を逆* / } プライベート 静的 ボイド(逆値int [] NUMSをint型スタート){ int型私は= 開始、 INT = nums.length 1-J。; ながら(私は< J)を{ スワップ(NUMS、I、J); 私は ++ 、 J- ; } } プライベート 静的 ボイドスワップ(int型 [] NUMSを、int型 I、INT {J) のint TEMP = NUMS [I]を、 NUMS [I] =のNUMS [J]。 NUMS [J] = TEMP。 } }