Given a set of distinct integers, return all possible subsets.
Notice
- Elements in a subset must be in non-descending order.
- The solution set must not contain duplicate subsets.
Example
If S = [1,2,3]
, a solution is:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
Challenge
Can you do it in both recursively and iteratively?
用递归写,每次给当前subset加从startIdx开始的后续元素,并调用自身。
记得三步走,for循环内部 1先加,2deepcopy放到result里,3删去加的元素
有一点对于123456,当下为13时的
134,自调,13,135,自调,13,136,自调,13这样的感觉。
1.如果题目要你subset有非降序要求,记得先对输入的nums排序。Arrays.sort(nums);
2.递归的头private void helper(List<Integer> current, int startIdx, int[] nums, List<List<Integer>> result){}
3.对输入数组int[] a的情况,null和a.length == 0还是不一样的!分开考虑,后者要返回一个空集。
4.切记加入结果的时候要deepcopy,不然你只是加了一堆同一个地址的物体,最终返回值是一群一样的为0的东西。
5.有时候可以把结果存放的东西作为参数传入,这样就不需要给private函数返回什么东西了。
public class Solution { /* * @param nums: A set of numbers * @return: A list of lists */ public List<List<Integer>> subsets(int[] nums) { // write your code here if (nums == null){ return null; } List<List<Integer>> result = new ArrayList<>(); List<Integer> blank = new ArrayList<Integer>(); result.add(blank); if (nums.length == 0){ return result; } //切记先sort,题目要求你非降序subsets Arrays.sort(nums); helper(blank, 0, nums, result); return result; } private void helper(List<Integer> current, int startIdx, int[] nums, List<List<Integer>> result){ for(int i = startIdx; i < nums.length; ++i){ current.add(nums[i]); result.add(new ArrayList<Integer>(current)); helper(current, i + 1, nums, result); current.remove(current.size() - 1); } } }