问题可以被理解为,给定一个整形数组,返回这个数组的下一个字典序。然后问题重点就是字典序是什么,下面是字典序介绍:
【字典序法】
C++的STL库里面有nextPermutation()方法,其实现就是字典序法。
下图简单明了地介绍了字典序法
归纳一下为:
例如,1234的全排列如下:
根据上面的逻辑很容易就写出来代码:
public class NextPermutation{
/*** 生成字典序的下一个排列 ***/
public void nextPermutation(int[] nums) {
if (nums.length == 0 || nums.length == 1) {
return;
}
// 找到最后一个正序
int i = nums.length - 1;
while (i > 0 && nums[i - 1] >= nums[i]) {
i--;
}
// 有了这个判断就不用num最初是按升序排好的了
if (i == 0) {
reverse(nums, 0, nums.length - 1);
return;
}
// 找到最后一个比num[i-1]大的数
int j = i;
while (j < nums.length && nums[j] > nums[i - 1]) {
j++;
}
// 交换num[i-1]和num[j-1]
int tmp = nums[i - 1];
nums[i - 1] = nums[j - 1];
nums[j - 1] = tmp;
// 反转i以后的数
reverse(nums, i, nums.length - 1);
}
public void reverse(int[] nums, int begin, int end) {
for (int i = begin, j = end; i < j; i++, j--) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
}