首页 > 其他 > 详细

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

时间:2019-11-07 20:53:18      阅读:87      评论:0      收藏:0      [点我收藏+]

题目描述:

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:

输入: nums = [1,2,3]
输出:
[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

题目解析:回溯的过程是执行一次深度优先遍历,一条路走到底,走不通的时候,返回回来,继续执行,一直这样下去,直到回到起点。

技术分享图片

代码实现:注意空集也是集合的子集

将结果集扩大操作放在循环里面

 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 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);
        }
    }
}

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

原文:https://www.cnblogs.com/ysw-go/p/11815058.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!