class Solution {
void swap(int []nums, int i, int j)
{
int t=nums[i];
nums[i]=nums[j];
nums[j]=t;
}
void swapWithGreater(int []nums, int i)
{
for(int j=nums.length-1;j>i;--j)
{
if(nums[j]>nums[i])
{
swap(nums,i,j);
return;
}
}
}
void reverse(int []nums, int i)
{
int last=nums.length-1;
while(i<last)
{
swap(nums,i,last);
++i;
--last;
}
}
public void nextPermutation(int[] nums) {
if(nums.length<2)return;
int i=nums.length-1;
for(;i>0;--i)//从数组最右边往最左边检测,每次检测相邻的两个数i-1和i,找到i-1小于i的情况
{
if(nums[i-1]<nums[i])break;
}
if(i!=0)
swapWithGreater(nums,i-1);//从最右边的元素到i为止的这段区间,从最右边的元素开始往左查找,找到一个比i-1大的元素进行交换
reverse(nums,i);//i到最右边的这段范围进行反转处理
}
}
参考答案写的;
基本思路,按字典顺序排除下一个组合,就是把右边较大的元素和左边某个位置交换。想象一下000一直变大到999的过程,是不是总是先从个位数变大直到进位,再由十位数变大?
这个过程类似但不一样。000到999用到了多少个数字?permutation这里可没有那么多。因此不能简单的加1处理。
浙公网安备 33010602011771号