[LeetCode] Next Permutation

题目描述


Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.

If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).

The replacement must be in-place, do not allocate extra memory.

Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
1,2,31,3,2
3,2,11,2,3
1,1,51,5,1


解题思路:


首先举个例子.35421->41235.那么我们是怎么找到下一个排列的呢?

1)从后往前找到第一个Ai,Aj,Ai<Aj.针对例子,找到3,5.这说明了3以后的应该是子序列全排列的最后一个排列,因为5后面都是逆序的.对吧?

2)继续从后往前寻找,找到第一个比Ai大的数,与Ai交换,毕竟Ai后面已经是全排序到头了,下一个全排序只能把Ai变大,对吧? 针对例子,找到了4,交换3,4.例子变成了45321.4后面的序列顺序依然是一个逆序.至于为什么?读者仔细思量一下就很容易明白啦.

3)接下来就很容易了,把i位置之后的数逆序一下就OK啦.也就是45321->41235.


解题代码:


public void nextPermutation(int[] num) {
        int j;
        for( j=num.length-1;j>0&&num[j-1]>=num[j];j--);//找i j,
        if(j==0)reverse(num,0,num.length-1);//如果已经是全排列的最后一个,直接逆序吧
        else
        {
            int i=j-1;
            int k;
            for(k=num.length-1;num[k]<=num[i];k--);//从后往前找第一个比ai大的数
            swap(num,i,k);//交换
            reverse(num,j,num.length-1);//把i后面的数逆序一下
        }
        return ;
            
    }
    public void swap(int[] num,int i,int j)
    {
        int tmp=num[i];
        num[i]=num[j];
        num[j]=tmp;
        return ;
    }
    public void reverse(int[] num,int i,int j)
    {
        while(i<j)
        {
            swap(num,i++,j--);
        }
        return ;
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值