zoukankan      html  css  js  c++  java
  • 全排列生成[转载]

    转自:https://blog.csdn.net/lemon_tree12138/article/details/50986990

    1.使用递归的方法

    思想是交换,有n个数的话,先将第一个数安排好,之后再去管理后面的n-1个数,这样递归下去,直到所有的其他数都管理好,那么就是一个排列。

    private static void core(int[] array) {
            int length = array.length;
            fullArray(array, 0, length - 1);
        }
        
        private static void fullArray(int[] array, int cursor, int end) {
            if (cursor == end) {
                System.out.println(Arrays.toString(array));
            } else {
                for (int i = cursor; i <= end; i++) {
                    ArrayUtils.swap(array, cursor, i);#交换
                    fullArray(array, cursor + 1, end);#管理剩下的数
                }
            }
        }

    但是上面这个代码是有问题的。。。得出来的会有重复的,具体我也没有思考为什么。

    主要应该是因为交换了之后,没有对数组进行还原吧!

    下面进行了还原:

    private static void fullArray(int[] array, int cursor, int end) {
            if (cursor == end) {
                System.out.println(Arrays.toString(array));
            } else {
                for (int i = cursor; i <= end; i++) {
                    ArrayUtils.swap(array, cursor, i);
                    fullArray(array, cursor + 1, end);
                    ArrayUtils.swap(array, cursor, i); // 用于对之前交换过的数据进行还原
                }
            }
        }

    2.存在相同元素

    判断cursor之后是否存在值相同的元素,如果有的话,那么就不交换了。

    3.非递归-基于元素大小

    需要知道找到next permutation的方法。

    先从右边往左找到下降的点,然后再从右找到最后一个大于它的数,然后交换即可。

  • 相关阅读:
    第一章Python 数据模型
    Numpy 之 where理解
    探析熟悉而又困惑的参数:argc && argv
    python读书笔记
    经典进程的同步问题之——读者写者
    经典进程的同步问题之——哲学家进餐
    冰多多团队博客目录
    团队事后分析
    冰多多团队Gamma阶段发布说明
    gamma测试报告
  • 原文地址:https://www.cnblogs.com/BlueBlueSea/p/12788367.html
Copyright © 2011-2022 走看看