这是一个片段,用于创建整数数组的所有可能排列。我特别想知道从tempList中删除最后一个元素时该行的用途。我曾尝试在各处添加打印语句,但是从概念上讲,我仍然不了解发生的递归回溯。
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
// Arrays.sort(nums); // not necessary
backtrack(list, new ArrayList<>(), nums);
return list;
}
private void backtrack(List<List<Integer>> list, List<Integer> tempList, int [] nums){
if(tempList.size() == nums.length){
list.add(new ArrayList<>(tempList));
} else{
for(int i = 0; i < nums.length; i++){
if(tempList.contains(nums[i])) continue; // element already exists, skip
tempList.add(nums[i]);
backtrack(list, tempList, nums);
tempList.remove(tempList.size() - 1);
}
}
}
答案 0 :(得分:0)
这是您的angular.module('myModule', [])
.component('list', {
template:
'<h1>Hello from List.js</h1>'
'<ul>' +
'<li>1</li>' +
'<li>2</li>' +
'</ul>'
})
函数的作用:
1)检查当前列表的长度是否与总数相同,这意味着将所有数字都添加到列表中。在这种情况下,请以相同的顺序创建一个新列表,并将其添加到列表的最终列表中,然后从当前递归调用中返回。
2)遍历所有数字,并检查该列表中是否不存在任何数字。这就是列表中存在所有数字的原因,继续在那里,这会跳过循环。如果所有数字都已经存在,它将从现有的递归调用中返回。
3)在列表中添加不存在的号码,然后再次调用backtrack,它将再次执行1号和2号
4)一旦达到一种情况,所有数字都由1进行了某种排列加法,最后一行将从backtrack
中删除当前递归调用所添加的数,因此相同的列表可用于其他不同排列。删除后,它将返回上一个递归调用。
当我执行tempList
{1,2,3}