自己没做出来,都看的discuss的方法
/**
* 将初始状态设为空集
* 遍历nums数组,每一个数字选择要or不要
* 之前遍历组成的res中已有的所有集合恰好是所有当前元素不要的组合,再给之前的每个集合加入当前元素并add进res
* 得到的大小扩大一倍的res就是当前元素参与后的所有子集
* nums中所有元素参与(即遍历完成)后,res就是nums的所有子集的集合
* Runtime: 0 ms, faster than 100.00%
* Memory Usage: 39.2 MB, less than 41.34%
*/
class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
res.add(new ArrayList<>());
for (int num : nums) {
int len = res.size();
for (int i = 0; i < len; i++) {
ArrayList pickRes = new ArrayList<>(res.get(i));
pickRes.add(num);
res.add(pickRes);
}
}
return res;
}
}
/**
* backtrack通用解法
* Runtime: 1 ms, faster than 52.04%
* Memory Usage: 39.4 MB, less than 19.81%
*/
class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
backtrack(res, new ArrayList<>(), nums, 0);
return res;
}
private void backtrack(List<List<Integer>> res, List<Integer> pre, int[] nums, int start) {
res.add(new ArrayList<>(pre));
for (int i = start; i < nums.length; i++) {
pre.add(nums[i]);
backtrack(res, pre, nums, i + 1);
pre.remove(pre.size() - 1);
}
}
}