分析: 是不是和全排列有点像,但是又不是全排列。是需要找到下一个字典序。 分析数列你会发现以下两个规律:
首先从右往左交换第一个正序:
- 例如1 2 3 5 4 交换3和4成为1 2 4 5 3.
其次根据交换的区间内,从右向左(双重循环)交换逆序对(仔细考虑边界哦):
- 例如上述变成1 2 4 3 5;
具体实现的时候,注意位置编号等问题。具体代码为:
public void nextPermutation(int[] nums) {
boolean jud=false;
int i,j=0;
for( i=nums.length-2;i>=0;i--)
{
for( j=nums.length-1;j>i;j--)
{
if(!jud&&nums[i]<nums[j])
{
int team=nums[i];
nums[i]=nums[j];
nums[j]=team;
jud=true;
break;
}
}
if(jud)break;
}
if(jud)
for(int k=nums.length-1;k>i;k--)
{
for(int m=k-1;m>i;m--)
{
if(nums[k]<nums[m])
{
int team=nums[k];
nums[k]=nums[m];
nums[m]=team;
}
}
}
int team;
if(!jud)
for( i=0;i<nums.length/2;i++)
{
team=nums[i];
nums[i]=nums[nums.length-1-i];
nums[nums.length-1-i]=team;
}
}
原创不易,bigsai请你帮两件事帮忙一下:
-
star支持一下, 您的肯定是我在平台创作的源源动力。
-
微信搜索「bigsai」,关注我的公众号,不仅免费送你电子书,我还会第一时间在公众号分享知识技术。加我还可拉你进力扣打卡群一起打卡LeetCode。
记得关注、咱们下次再见!