next-permutation

来源:互联网 发布:001a航母 知乎 编辑:程序博客网 时间:2024/06/05 11:35

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

例如:

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;    }}


0 0
原创粉丝点击