31. Next Permutation

这是别人的解释,自己打的代码,在当前序列中,从尾端往前寻找两个相邻元素,前一个记为first,后一个记为second,并且满足first 小于 second。然后再从尾端寻找另一个元素number,如果满足first 小于number,即将第first个元素与number元素对调,并将second元素之后(包括second)的所有元素颠倒排序,即求出下一个序列

example:
6,3,4,9,8,7,1
此时 first = 4,second = 9
从尾巴到前找到第一个大于first的数字,就是7
交换4和7,即上面的swap函数,此时序列变成6,3,7,9,8,4,1
再将second=9以及以后的序列重新排序,让其从小到大排序,使得整体最小,即reverse一下(因为此时肯定是递减序列)
得到最终的结果:6,3,7,1,4,8,9

还有特殊情况就是i==0

public class Solution {
    public void nextPermutation(int[] nums) {
        if(nums.length<=1)return;
        int i = nums.length-1;
        for(;i>=1;i--){
            if(nums[i-1]<nums[i])
                break;
        }
        int first = i-1;
        int second = i;
        if(i!=0){//3,2,1 → 1,2,3  这种是i==0的情况,就是直接翻转
            int j =nums.length-1;
            for(;j>i-1;j--){
                if(nums[j]>nums[first])break;
            }

                swap(nums,first,j);
        }
        reverse(nums,second,nums.length-1);

    }
    private  void swap(int[]nums,int i,int j){
        int t = nums[i];
        nums[i] = nums[j];
        nums[j] = t;
    }
    private void reverse(int []nums,int start,int end){
        int i=start;
        int j=end;
        while(i<j){
            swap(nums,i,j);
            i++;
            j--;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值