1,1,5 → 1,5,1
分三步,
1. 從後往前,找到第一個不是遞增的數
2. 在從後往前找到一個比剛才那個數大的第一個數,交換位置
3. 在將第一個數後面的序列反轉
public class Solution {
public void nextPermutation(int[] num) {
if (num == null || num.length < 2) {
return;
}
int len = num.length;
int i = len - 2;
for (; i >= 0; i--) {
if (num[i] < num[i + 1]) {
break;
}
}
if (i == -1) {
reverse(num, 0, len - 1);
return;
}
for (int j = len - 1; j > i; j--) {
if (num[j] > num[i]) {
swap(num, j, i);
break;
}
}
reverse(num, i + 1, len - 1);
return;
}
private void reverse(int[] num, int start, int end) {
while (start < end) {
swap(num, start, end);
start++;
end--;
}
}
private void swap(int[] num, int i, int j) {
int temp = num[i];
num[i] = num[j];
num[j] = temp;
}
}