
每天发一道 leetcode 题目,最近发现 A 的回溯题目有点多,基本就用一个模板搞定。
class Solution { public List<List<Integer>> subsets(int[] nums) { List<List<Integer>> list = new ArrayList<>(); Arrays.sort(nums); backtrack(list, new ArrayList<>(), nums, 0); return list; } private 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); } } } class Solution: def subsets(self, nums): """ :type nums: List[int] :rtype: List[List[int]] """ list = [] nums.sort() self.bracktrack(list, [], nums, 0) return list def bracktrack(self, list, tempList, nums, start): list.append(tempList.copy()) for i in range(start, len(nums)): tempList.append(nums[i]) self.bracktrack(list, tempList, nums, i + 1) tempList.pop() class Solution { public List<List<Integer>> combine(int n, int k) { List<List<Integer>> res = new ArrayList<>(); backtrack(res, n, 1, k, new ArrayList<>()); return res; } public void backtrack(List<List<Integer>> res, int n, int num, int k, List<Integer> list) { if (list.size() == k) { res.add(new ArrayList<>(list)); } else { for (int i = num; i <= n; i++) { list.add(i); backtrack(res, n, i + 1, k, list); list.remove(list.size() - 1); } } } } class Solution: def backtrack(self, res, n, nums, k, current): if len(current) == k: res.append(current.copy()) else: for i in range(nums, n + 1): current.append(i) self.backtrack(res, n, i + 1, k, current) current.pop() def combine(self, n, k): """ :type n: int :type k: int :rtype: List[List[int]] """ res = [] self.backtrack(res, n, 1, k, []) return res class Solution { public static List<List<Integer>> permute(int[] nums) { List<List<Integer>> res = new ArrayList<>(); backtrack(res, new ArrayList<>(), nums); return res; } public static void backtrack(List<List<Integer>> res, List<Integer> tempRes, int[] nums) { if (tempRes.size() == nums.length) { //遍历完了,不需要回溯了. res.add(new ArrayList<>(tempRes)); } else { for (int i = 0; i < nums.length; i++) { if (tempRes.contains(nums[i])) { //System.out.println("i:" + i + "---" + tempRes.stream().map(String::valueOf).collect(Collectors.joining(","))); continue; } tempRes.add(nums[i]); //System.out.println("i:" + i + "---" + tempRes.stream().map(String::valueOf).collect(Collectors.joining(","))); backtrack(res, tempRes, nums); tempRes.remove(tempRes.size() - 1); //System.out.println("i:" + i + ":afterRemoveLast---" + tempRes.stream().map(String::valueOf).collect(Collectors.joining(","))); } } } } class Solution { public static List<List<Integer>> permuteUnique(int[] nums) { List<List<Integer>> res = new ArrayList<>(); Arrays.sort(nums); boolean[] used = new boolean[nums.length]; backtrack(res, new ArrayList<>(), nums, used); return res; } public static void backtrack(List<List<Integer>> res, List<Integer> tempRes, int[] nums, boolean[] used) { if (tempRes.size() == nums.length) { //遍历完了,不需要回溯了. res.add(new ArrayList<>(tempRes)); } else { for (int i = 0; i < nums.length; i++) { if (used[i]) { continue; } if (i > 0 && nums[i - 1] == nums[i] && !used[i - 1]) { continue; } used[i] = true; tempRes.add(nums[i]); backtrack(res, tempRes, nums, used); used[i] = false; tempRes.remove(tempRes.size() - 1); } } } }