LEETCODE注釈アルゴリズム31:
取得された配列の機能を実装し、所定のアルゴリズムは、辞書的に大きい構成で次のシーケンス番号を再配置が必要です。
次に大きな配列が存在しない場合、再配列アラインメント(すなわち、昇順)の最小数。
あなただけの一定の追加のスペースを許可する、編集を配置する必要があります。
以下は、右の列に対応する出力で、いくつかの例では、左側の入力欄です。
→1,3,2 1,2,3
3,2,1→1,2,3
1,1,5 1,5,1→
ソリューション:まず、辞書式の意味を理解する:数字1,2,3のために... n個配置され、左から右の関係とは異なる配列を順次決定し、対応する番号に1ずつ比較しています。二つの例を説明する:5034150431の
第一及び第二の番号が両方とも同じであり、第三の比較、50341 50431の前に、その後4> 3、。
どこにますます大きな自由配置に出力配列。
アレイはもはや降順に配置されている1>。このような状況扱いやすいです。
次に高い順見つける方法以下に説明2>:6437521のような
、1,2,5,7-がインクリメントされて右から左へ、デジタルアルファベット位置のサイズを決定するには、インクリメンタル位置に不可能です。
数値Aおよび6437521サイズを比較した場合、小さい数5大きい場合によって決まる、フロント4つの命令Aが6437であり、次いで、これ以上3桁の存在下で、5つの数字よりも、可能な説明は6437521より大きくありません。
したがって、インクリメンタル位置特定をしないことを決めました。私たちは、NUMS位置iの[i]の<NUMS [I + 1]を見つける必要があります。この位置は数3です。7521において3つ以上の最小5、交換を発見し、それは6437521よりも大きいが、この時間は数は、6457321となっているが、それは最小ではありません。条件を満たす下降工程7321において6457321は、6451237は次大きく配置されています。
実際には、このとき第一ケースと第二ケースを組み合わせることができます。いいえ配置は、私を見つけることができない大きい位置ではありません。
コードは以下の通りであります:
public class Solution {
public void nextPermutation(int[] nums) {
int i = nums.length - 2;
while (i >= 0 && nums[i + 1] <= nums[i]) {
i--;
}
//当没有找到i时,i=-1,是不会进入if的,直接reverse将数组翻转即可。
if (i >= 0) {
int j = nums.length - 1;
//寻找i之后比i大的最小值做交换
while (j >= i && nums[j] <= nums[i]) {
j--;
}
swap(nums, i, j);
}
reverse(nums, i + 1);
}
private void reverse(int[] nums, int start) {
int i = start, j = nums.length - 1;
while (i < j) {
swap(nums, i, j);
i++;
j--;
}
}
private void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}