字典排序之全排列

简介:计算所给元素的所有全排列组合有多重方法,此篇文章说明字典排序方法求解全排列。何为字典排序?指的是元素按照0-9,a-z的顺序排列,这样使得与计算的全排列结果与上一个结果具有最长的前缀。

算法原理:P = {1,2,3,...n},元素集合

1、在P中从右向左遍历,直至查到P_{i}_P_{i+1}_ ,记录i的值

2、在P中从右向左遍历,找到第一个比P_{i}_大的值 P_{j}_,记录此时j的值

3、交换P_{i}_​​​​​​​ 和P_{j}_​​​​​​​的值

4、将i以后的值翻转,得到新的序列

5、重复第一步,直至所有的元素都已经是倒序排列

代码实现:

public static List> permute(int[] nums) {
    List> result = new ArrayList<>();
    List tempResult = new ArrayList<>();
    for (int num : nums) {
        tempResult.add(num);
    }
    result.add(new ArrayList<>(tempResult));
    while (true) {
        // 第一个左边数小于右边数的位置
        int index = 0;
        for (int j = tempResult.size() - 1; j > 0; j--) {
            if (tempResult.get(j - 1) < tempResult.get(j)) {
                index = j - 1;
                break;
            }
        }
        // index右侧大于index位置值的最小位置
        int lastIndex = 0;
        boolean isFind = false;
        for (int i = tempResult.size() - 1; i > index; i--) {
            if (tempResult.get(i)> tempResult.get(index)) {
                lastIndex = i;
                isFind = true;
                break;
            }
        }
        if (!isFind) {
            break;
        }
        // 交换index和lastIndex的值
        int temp = tempResult.get(index);
        tempResult.set(index, tempResult.get(lastIndex));
        tempResult.set(lastIndex, temp);
        // 将index后的元素翻转
        int len = tempResult.size() - index - 1;
        for (int k = 1, l = tempResult.size() - 1; k <= len / 2; k++) {
            int value = tempResult.get(k + index);
            tempResult.set(k + index, tempResult.get(l));
            tempResult.set(l, value);
            l--;
        }
        result.add(new ArrayList<>(tempResult));
    }
    return result;
}

 

 

你可能感兴趣的:(算法题目)