
/**
下一个排列:高位尽量不变,低位通过调整实现最小幅度的增大,若原本就是递减排序(无法再增大)则直接将其逆序转变为升序排列
核心:
低位通过调整实现最小幅度的增大
从末位开始向前遍历(实际上是末位的前一个元素),找到第一个满足nums[i] < nums[i + 1]的元素i; 即找到位数最低的可增大的位置
再次从末位向前遍历,找到第一个满足nums[j] > nums[i]的元素j,并将i与j交换; 即最小幅度的增大(不完全)
将i以后的元素进行翻转,也就是翻转[i + 1,nums.length - 1]; 后面原本是降序,反转后变为升序,完全实现最小幅度的增大
*/
class Solution {
/**
下一个排列:高位尽量不变,低位通过调整实现最小幅度的增大,若原本就是递减排序(无法再增大)则直接将其逆序转变为升序排列
核心:
低位通过调整实现最小幅度的增大
从末位开始向前遍历(实际上是末位的前一个元素),找到第一个满足nums[i] < nums[i + 1]的元素i; 即找到位数最低的可增大的位置
再次从末位向前遍历,找到第一个满足nums[j] > nums[i]的元素j,并将i与j交换; 即最小幅度的增大(不完全)
将i以后的元素进行翻转,也就是翻转[i + 1,nums.length - 1]; 后面原本是降序,反转后变为升序,完全实现最小幅度的增大
*/
public void nextPermutation(int[] nums) {
int i = nums.length - 2;
while(i >= 0 && nums[i] >= nums[i + 1]) {
i--;
}
if(i >= 0) {
int j = nums.length - 1;
while(nums[j] <= nums[i]) {
j--;
}
swap(nums, i, j);
}
reverse(nums, i + 1, nums.length - 1);
}
private void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
private void reverse(int[] nums, int start, int end) {
while(start <= end) {
swap(nums, start, end);
start++;
end--;
}
}
}

被折叠的 条评论
为什么被折叠?



