下一个排列
解题思路:
后序遍历找到前一个比后一个小的数,用 j 记录下位置,再从 j 忘后找到最小的比它大的数,交换,交换后不一定就是最后的结果,要把 j 后面的数升序排列就得到最终结果。
代码:
public void NextPermutation(int[] nums)
{
int i=nums.Length-1;
int j=0;
while(i>0)
{
if(nums[i]<=nums[i-1])
{
i--;
}
else
{
j=i-1;
break;
}
}//用j记录下找到需要交换的数字的位置。
while(nums[j]<nums[i]&&i<nums.Length-1)
{
if(nums[j]<nums[i+1])
{
i++;
}
else break;
}
if(i==0)
{
int a=0,b=nums.Length-1;
while(a<b)
{
int temp=nums[a];
nums[a]=nums[b];
nums[b]=temp;
a++;
b--;
}
}//说明不存在更大序列,重排成最小序列。
else
{
int flag=nums[i];
nums[i]=nums[j];
nums[j]=flag;
for(int n=j+1;n<nums.Length-1;n++)
{
int min=n;
for(int m=n+1;m<nums.Length;m++)
{
if(nums[m]<nums[min])
{
min=m;
}
}
int flag2=nums[n];
nums[n]=nums[min];
nums[min]=flag2;
}//j后面的数也要升序排列。
}//此时交换。
}