力扣-46.全排列
题目描述
给定一个不含重复数字的数组 nums
,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> path = new ArrayList<>();void backtracking(int[] nums, boolean[] used){if(path.size() == nums.length){res.add(new ArrayList(path)); //直接添加path会保存引用,回溯时修改path内容会导致已保存的结果同步变化。return;}for (int i = 0; i < nums.length; i++) {if(!used[i]){path.add(nums[i]);used[i]=true;backtracking(nums,used);path.remove(path.size()-1);used[i]=false;}}}public List<List<Integer>> permute(int[] nums) {boolean[] used = new boolean[nums.length];backtracking(nums,used);return res;}
}
小结:此题为回溯的经典题目,暂时当做模板记忆,等做多了应该会好些,需要注意的是java和C++的引用机制不同。
回溯题目模板
void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果}
}