class Solution {
public void nextPermutation(int[] nums) {
int pivot = findPivot(nums);
if (pivot == 0) {
reverse(0, nums);
} else {
pivot = pivot-1;
int swapTarget = findSwapTarget(nums, pivot);
swap(nums, pivot, swapTarget);
reverse(pivot+1, nums);
}
}
private int findSwapTarget(int[] nums, int pivot) {
for (int i = nums.length-1; i > pivot; i--) {
if (nums[i] > nums[pivot]) {
return i;
}
}
return -1;
}
// 34321
private int findPivot(int[] nums) {
for (int i = nums.length - 1; i >= 1; i--) {
if (nums[i] > nums[i-1]) {
return i;
}
}
return 0;
}
private void swap(int[] nums, int left, int right) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
private void reverse(int start, int[] nums) {
System.out.println(start);
int left = start;
int right = nums.length - 1;
while (left < right) {
swap(nums, left, right);
left++;
right--;
}
}
}
/*
4 521
swap
5 421 => 然後後面當然要最小的狀況, 所以做 reverse
=>
5 124
ex:
[3] 8642 => 後面這部分不能在改動了, 因為無法更大, 由低位到高位是升序
所以就會打前面的主意
3 跟 後面比他大的交換(剛好大一點的, 也就是從低位 2, 4, ...
so 3 and 4 swap,
4 8632 => 後面在 reverse
4 2368
少動高位
1. find ascding order from last
2. if index numk not , swap this numk with the first number larger than numk (between numk+1 to end)
3. swap
4. reverse rest number (between numk+1 to end), because we want smallest one in the rest part
ex:
[3] 8642
4 8632
4 2368
*/