Leetcode題目78.子集(回溯-中等)

題目描述: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);
        }
    }
}
相關文章
相關標籤/搜索