題目描述:java
給定一組不含重複元素的整數數組 nums,返回該數組全部可能的子集(冪集)。數組
說明:解集不能包含重複的子集。blog
示例: 輸入: nums = [1,2,3] 輸出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
題目解析:回溯的過程是執行一次深度優先遍歷,一條路走到底,走不通的時候,返回回來,繼續執行,一直這樣下去,直到回到起點。遞歸
代碼實現:注意空集也是集合的子集rem
將結果集擴大操做放在循環裏面io
public static List<List<Integer>> subsets(int[] nums) { List<List<Integer>> res = new ArrayList<>(); return backTrace(0, nums, res, new ArrayList<>()); } private static List<List<Integer>> backTrace(int i, int[] nums, List<List<Integer>> res, ArrayList<Integer> tmp) { if (tmp.size() == 0) { res.add(new ArrayList<>(tmp)); } for (int j = i; j < nums.length; j++) { tmp.add(nums[j]); res.add(new ArrayList<>(tmp)); backTrace(j + 1, nums, res, tmp); //遞歸結束,恢復狀態 tmp.remove(tmp.size() - 1); } return res; }
將結果集新增放在循環外面class
class Solution { public static List<List<Integer>> subsets(int[] nums) { List<List<Integer>> res = new ArrayList<>(); backtrack(0, nums, res, new ArrayList<>()); return res; } private static void backtrack(int i, int[] nums, List<List<Integer>> res, ArrayList<Integer> tmp) { res.add(new ArrayList<>(tmp)); for (int j = i; j < nums.length; j++) { tmp.add(nums[j]); backtrack(j + 1, nums, res, tmp); tmp.remove(tmp.size() - 1); } } }