next-permutation

题目描述:找到排序数组的下一个排序

例如:

1,2,3→1,3,2
3,2,1→1,2,3
1,1,5→1,5,1


字典序排列
把升序的排列(当然,也可以实现为降序)作为当前排列开始,然后依次计算当前排列的下一个字典序排列。

对当前排列从后向前扫描,找到一对为升序的相邻元素,记为i和j(i < j)。如果不存在这样一对为升序的相邻元素,则所有排列均已找到,算法结束;否则,重新对当前排列从后向前扫描,找到第一个大于i的元素k,交换i和k然后对从j开始到结束的子序列反转,则此时得到的新排列就为下一个字典序排列。这种方式实现得到的所有排列是按字典序有序的,这也是C++ STL算法next_permutation的思想。

public class Solution {
    public void nextPermutation(int[] num) {
        if(num == null||num.length <2)
            return;
        int index= -1;
        for(int i=num.length-1;i>0;i--)
            {
            if(num[i-1]<num[i])
                {
                index=i-1;
                break;//找到第一个升序的相邻的元素,找到就break!!
            }
        }
        if(index == -1)
            {
            reverse(num,0,num.length-1);
        }
        else
            {
            int k=num.length-1;
            for(;k>=0&&num[k]<=num[index];k--)
                {}
            swap(num,index,k);
            reverse(num,index+1,num.length-1);
        }
    }
    public void reverse(int[] num,int start,int end)
        {
        while(start<end)
            {
            int temp=num[start];
            num[start]=num[end];
            num[end]=temp;
            start++;
            end--;
        }
    }
    public void swap(int[] num,int i,int j)
        {
        int temp=num[i];
        num[i]=num[j];
        num[j]=temp;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值