Given a set of distinct integers, nums, return all possible subsets (the power set).
Note: The solution set must not contain duplicate subsets.
Example:
Input: nums = [1,2,3] Output: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
输出给定数组的所有子集
第一个想法是递归,当然的,时间复杂度会高一点,下面附上讨论区看到的一个答案,比我自己的写的更清楚,很简洁明了
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
Arrays.sort(nums);
backtrack(list, new ArrayList<>(), nums, 0);
return list;
}
private void backtrack(List<List<Integer>> list , List<Integer> tempList, int [] nums, int start){
list.add(new ArrayList<>(tempList));
for(int i = start; i < nums.length; i++){
tempList.add(nums[i]);
backtrack(list, tempList, nums, i + 1);
tempList.remove(tempList.size() - 1);
}
}
BFS:这是在讨论区看到的一个答案,觉得想法很好,分享一下,附上地址讨论区非递归方法
大体思路:一个数可以选择加到每个集合中或者不加到集合中。因此每次遍历时,获取每个集合赋值给新集合,数字加到集合上在放回大集合,这样就有一个包含该数的集合和一个不包含该数的集合。
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
result.add(new ArrayList<>());
for(int n : nums){
int size = result.size();
for(int i=0; i<size; i++){
List<Integer> subset = new ArrayList<>(result.get(i));
subset.add(n);
result.add(subset);
}
}
return result;
}