我注意到许多回溯问题有两种解决方法。
一个是返回“无论什么是必需的列表”,而不是传递每个呼叫的“结果”并附加到它。 返回的缺点是什么?(内存/时间效率更低)? 示例:要打印所有可能的排列,是什么使得此解决方案与第二个解决方案相比效率低下? 对不起,如果这不是正确的论坛,我找不到更好的地方。
if(myMap.count(0) == 1) // for key == 0
第二种方法---
public List<List<Integer>> perm(int[] nums){
List<List<Integer>> result = new ArrayList<List<Integer>>();
if(nums.length == 0){
result.add(new ArrayList<Integer>());
return result;
}
for(int i= 0;i<nums.length;i++){
int first = nums[i];
int[] remnums = new int[nums.length-1];
int j = 0;
for(int cur : nums){
if(cur != first){
remnums[j] = cur;j++;
}
}
List<List<Integer>> tmp = perm(remnums);
for(List<Integer> t : tmp){
t.add(0,first);
}
result.addAll(tmp);
}
return result;
}
答案 0 :(得分:0)
两种解决方案都无效,因为它们使用递归(这是一个巨大的内存占用),我建议将您的第一个解决方案转换为不依赖于堆栈的可迭代解决方案(也是内存问题但不会导致堆栈溢出),例如就像这一个:https://stackoverflow.com/a/11471673/5991334