【发布时间】: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