Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.
1,7,6,5,4,3 -> 3,1,4,5,6,7
7,6,5,8,3 -> 7,6,8,3,5
这里实际上是找下一个更大的数字。比如1,2,3 我们很容易知道下一个数字是1,3,2。
从尾到头找,第一段ascending的部分出现。后面的部分就可以有更大的组合。
i
9 1 7 5 4 3
j
9 3 7 5 4 1
i+1
9 3 1 4 5 7
i
9 6 7 5 4 3
j
9 7 6 5 4 3
i+1
9 7 3 4 5 6
public class Solution {
public void nextPermutation(int[] nums) {
if(nums.length <= 1) return;
int i = nums.length - 2;
// 找到尾部的第一段递减序列。
while(i >= 0 && nums[i] >= nums[i+1]){
i--;
}
if(i >= 0){
int j = nums.length - 1;
// 这里是在递减序列中找到下一个比nums[i]大的数字,作为序列的头。
while(i < j && nums[j] <= nums[i]){
j--;
}
swap(nums, i, j);
}
// 尾部的递减序列变成递增序列。
reverse(nums, i+1, nums.length-1);
}
public void swap(int[] nums, int i, int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
public void reverse(int[] nums, int i, int j){
while(i < j){
swap(nums, i, j);
i++;
j--;
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。