【问题标题】:trouble generating permutations产生排列的麻烦
【发布时间】:2019-01-17 06:01:52
【问题描述】:

我正在尝试在给定 Java 中不同整数数组的情况下生成排列,但无法弄清楚我的解决方案有什么问题。

我知道网上有数百种解决方案,但我正在尝试使用对我有意义的特定方法(而不是试图记住别人的算法)来做到这一点。 我的逻辑是,给定 {1, 2, 3, 4},我应该循环遍历并递归打印

1 + permute({2, 3, 4})
2 + permute({1, 3, 4})
3 + permute({1, 2, 4})
4 + permute({1, 2, 3})

所以基本上将当前元素添加到结果中,并递归调用剩余元素的置换。但是我没有得到正确的结果,我不知道为什么,我已经盯着代码看了好几个小时了。

class Solution {
    public List<List<Integer>> permute(int[] nums) {
        ArrayList<List<Integer>> result = new ArrayList<List<Integer>>();
        ArrayList<Integer> tmp = new ArrayList<Integer>();
        getPerm(nums.length, nums, tmp, result);
        return result;
    }

    private void getPerm(int n, int[] a, ArrayList<Integer> tmp, ArrayList<List<Integer>> result){

       // System.out.println("Calling on array " + Arrays.toString(a));
          //  System.out.println("tmp is " + tmp.toString());
          //  System.out.println("n is " + n);



        if(n == 0){
            ArrayList<Integer> toAdd = new ArrayList<Integer>(tmp);
            result.add(toAdd);
            tmp.clear();
           // tmp = new ArrayList<Integer>();
            return;
        }
        for(int i = 0; i < n; i++){
            tmp.add(a[i]);
            int[] b = new int[n-1];
            int k = 0;
            int j = 0;
            while(k<b.length){
                if(a[i]==a[j]){j++;}
                else{b[k]=a[j]; k++; j++;}
            }

            getPerm(n-1, b, tmp, result);
        }
    }
}

For input = [1, 2, 3]
Expect [[1,2,3],[2,1,3],[2,3,1],[1,3,2],[3,1,2],[3,2,1]]
But output is [[1,2,3],[3,2],[2,1,3],[3,1],[3,1,2],[2,1]]

【问题讨论】:

    标签: java recursion permutation


    【解决方案1】:

    让我们看看输入 {1,2,3} 的算法:

    • 首先将 1 添加到 tmp
    • 然后调用 getPerm(2, [2, 3], [1], [])
    • 然后将 2 添加到 tmp
    • 然后你调用 getterm (1, [3], [1, 2], [])
    • 然后将 3 添加到 tmp
    • 然后你调用 getPerm(0, [], [1, 2, 3], [])
    • 现在将第一个排列 [1, 2, 3] 添加到结果中并clear tmp
    • 因此,应该是 [1, 3, 2] 的下一个排列将缺少 1

    如果不是每次向结果添加排列时都清除 tmp,而是在递归调用之后仅删除添加到 tmp 的最后一个元素,则可以解决此问题:

    private void getPerm(int n, int[] a, ArrayList<Integer> tmp, ArrayList<List<Integer>> result)
    {
        if(n == 0){
            ArrayList<Integer> toAdd = new ArrayList<Integer>(tmp);
            result.add(toAdd);
            // don't clear tmp here
            return;
        }
        for(int i = 0; i < n; i++){
            tmp.add(a[i]);
            int[] b = new int[n-1];
            int k = 0;
            int j = 0;
            while(k<b.length){
                if(a[i]==a[j]){j++;}
                else{b[k]=a[j]; k++; j++;}
            }
    
            getPerm(n-1, b, tmp, result);
            tmp.remove(tmp.size()-1); // remove the last element added to tmp
        }
    }
    

    现在的输出是:

    [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 2017-02-23
      • 1970-01-01
      • 2014-12-13
      • 2012-02-24
      • 1970-01-01
      • 2011-07-26
      相关资源
      最近更新 更多