Subsets

Given a set of distinct integers, nums, return all possible subsets.

Note: The solution set must not contain duplicate subsets.

For example, If nums = [1,2,3], a solution is:

[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

Tips:

Recursion:查一下复杂度

  • 自己的方法注意需要有一个temp,第二次进dfs时需要将prev还原为temp。O(2^n)

  • 如果用别人的方法注意不用两次进dfs,只要remove最后一个加进prev的就好。

      这种问题都跟结果的多少有关。subsets一共有多少个?2^n个,每个有少个数字?最多n个。所以复杂度是**O\\(n \\* 2^n\\)**
    

Iterative:

  • 注意各种new

Bit Manipulation:

  • if((i &(1 << j)) != 0)

Code:

Recursion1

public class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        if (nums == null || nums.length == 0) return res;
        dfs(nums, res, 0, new ArrayList<Integer>());
        return res;
    }

    private void dfs(int[] nums, List<List<Integer>> res, int index, List<Integer> prev) {
        if (index == nums.length) {
            res.add(new ArrayList<Integer>(prev));
            return;
        }
        List<Integer> temp = new ArrayList<Integer>(prev);
        prev.add(nums[index]);
        dfs(nums, res, index + 1, prev);
        dfs(nums, res, index + 1, temp);
    }
}

Recursion2:

public class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();
        if (nums == null || nums.length == 0) {
            return result;
        }
        dfs(nums, result, new ArrayList<Integer>(), 0);
        return result;
    }
    private void dfs(int[] nums, List<List<Integer>> result, List<Integer> path, int depth) {
        result.add(new ArrayList<Integer>(path));
        for (int i = depth; i < nums.length; i++) {
            path.add(nums[i]);
            dfs(nums, result, path, i + 1);
            path.remove(path.size() - 1);
        }
    }
}

Iterative:

public class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        if (nums == null || nums.length == 0) return res;
        res.add(new ArrayList<Integer>());
        for (int i = 0; i < nums.length; i++) {
            List<List<Integer>> newRes = new ArrayList<>(res);
            for (List<Integer> l : res) {
                List<Integer> newList = new ArrayList<>(l);
                newList.add(nums[i]);
                newRes.add(newList);
            }
            res = newRes;
        }
        return res;
    }
}

Bit Manipulation:

class Solution {
    public ArrayList<ArrayList<Integer>> subsets(int[] nums) {
        ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
        int n = nums.length;
        Arrays.sort(nums);
        result.add(new ArrayList<Integer>());
        for (int i = 1; i < (1 << n); i++) {
            ArrayList<Integer> subset = new ArrayList<Integer>();
            for (int j = 0; j < n; j++) {
                if ((i & (1 << j)) != 0) {
                    subset.add(nums[j]);
                }
            }
            result.add(subset);
        }
        return result;
    }
}

results matching ""

    No results matching ""