【发布时间】:2016-10-15 09:40:29
【问题描述】:
我正在尝试解决以下问题:
给定一组可能包含重复的数字,返回 所有可能的唯一排列。
这是我的代码:
public class Solution {
public ArrayList<ArrayList<Integer>> permute(ArrayList<Integer> a) {
HashMap<ArrayList<Integer>, Boolean> unique = new HashMap<>();
ArrayList<ArrayList<Integer>> results = new ArrayList<>();
permu(results, a, 0, unique);
return results;
}
private void permu(ArrayList<ArrayList<Integer>> results, final ArrayList<Integer> a, int item, HashMap<ArrayList<Integer>, Boolean> unique) {
for(int i = 0; i < a.size(); i++) {
ArrayList<Integer> aClone = new ArrayList<>(a);
// swap
int backup = aClone.get(i);
aClone.set(i, aClone.get(item));
aClone.set(item, backup);
if(!unique.containsKey(aClone)) {
results.add(aClone);
unique.put(aClone, true);
permu(results, aClone, i, unique); //<--- Stack overflow error
}
}
}
}
我在调用循环时遇到堆栈溢出错误,第 (19) 行
【问题讨论】:
-
你能在发生 stackoverflow 错误的行旁边写一个注释吗?在这里计算行号对我们来说不太实用。
-
确定 > permu(results, aClone, i, unique);
-
问题已编辑
-
你每次都是从0开始。我想你的意思是
int i = item;。 -
这是为了某种编码竞赛,对吧?诀窍在于其中一项测试包含一个整数,该整数出现 许多 次......可能产生和检查所有 n 的次数如此之多!即使没有溢出堆栈,排列也会超时。
标签: java algorithm stack-overflow