Java 回溯算法|数组子集:数组如何删除元素?
下面的代码用于查找数组的所有子集。这个解决方案使用了回溯算法。但是我对这个解决方案有点困惑。当圣堂武士为[1,2,3]时,i=3,则呼叫结束。所以圣殿骑士变成了[1,2],我的问题是圣殿骑士是如何变成的? 我画了一张关于我的问题的照片,红线是我困惑的地方。有人能帮我吗?任何帮助都将不胜感激!提前谢谢。(我已经调试了这段代码,我仍然无法解决我的问题)Java 回溯算法|数组子集:数组如何删除元素?,java,algorithm,backtracking,Java,Algorithm,Backtracking,下面的代码用于查找数组的所有子集。这个解决方案使用了回溯算法。但是我对这个解决方案有点困惑。当圣堂武士为[1,2,3]时,i=3,则呼叫结束。所以圣殿骑士变成了[1,2],我的问题是圣殿骑士是如何变成的? 我画了一张关于我的问题的照片,红线是我困惑的地方。有人能帮我吗?任何帮助都将不胜感激!提前谢谢。(我已经调试了这段代码,我仍然无法解决我的问题) 公共静态列表子集(int[]nums){ 列表=新的ArrayList(); 数组。排序(nums); 回溯(列表,新ArrayList(),num
公共静态列表子集(int[]nums){
列表=新的ArrayList();
数组。排序(nums);
回溯(列表,新ArrayList(),nums,0);
退货清单;
}
私有静态无效回溯(列表列表、列表模板列表、int[]nums、int开始){
添加(新的ArrayList(tempList));
对于(int i=开始;i
templast.remove(templast.size()-1)
是从递归调用返回后执行作业的内容每个递归调用从列表中删除一个元素,但当递归调用返回时,它上面的调用可以删除另一个元素。您应该重命名该方法。这不是回溯。没有任何步骤不导致解决方案的一部分。这只是一个递归。templast.remove(templast.size()-1)
是从递归调用返回后执行作业的内容每个递归调用从列表中删除一个元素,但当递归调用返回时,它上面的调用可以删除另一个元素。您应该重命名该方法。这不是回溯。没有任何步骤不导致解决方案的一部分。这只是一个递归。
public static List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
Arrays.sort(nums);
backtrack(list, new ArrayList<>(), nums, 0);
return list;
}
private static void backtrack(List<List<Integer>> list, List<Integer> tempList, int[] nums, int start) {
list.add(new ArrayList<>(tempList));
for (int i = start; i < nums.length; i++) {
tempList.add(nums[i]);
backtrack(list, tempList, nums, i + 1);
tempList.remove(tempList.size() - 1);
}
}