• 全排列生成[转载]


    转自: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的方法。

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

  • 相关阅读:
    Sign Distance Field 2
    矩阵相乘优化
    Editor GUI 的 Gamma Correction
    GPUSkinning 5
    GPUSkinning 2
    RenderTextureFormat.ShadowMap
    战争迷雾
    Texture2DArray(2)
    软件渲染器 YwSoftRenderer
    将 Unity5.3 的老项目升级到 Unity 2018.3 遇到的些许问题。
  • 原文地址:https://www.cnblogs.com/BlueBlueSea/p/12788367.html
Copyright © 2020-2023  润新知