Subsets
Given a set of distinct integers, return all possible subsets.
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],
[]
]
Note
提供3种方法:
简单的递归(取或者不取):递归树的每一层判断当前元素取或者不取
更通用的DFS :就是所谓的Backtracking,找到以某几个元素开头的并回复到之前到状态
BFS方法:分层输出
Time O(n*2^n)
Space O(n)
Code
public class Solution2 {
/**
* @param nums: A set of numbers
* @return: A list of lists
*/
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> results = new ArrayList<>();
Arrays.sort(nums);
dfs(nums, 0, new ArrayList<Integer>(), results);
return results;
}
// 1. 递归的定义
// 以 subset 开头的,配上 nums 以 index 开始的数所有组合放到 results 里
private void dfs(int[] nums,
int index,
List<Integer> subset,
List<List<Integer>> results) {
// 3. 递归的出口
if (index == nums.length) {
results.add(new ArrayList<Integer>(subset));
return;
}
// 2. 递归的拆解
// (如何进入下一层)
// 选了 nums[index]
subset.add(nums[index]);
dfs(nums, index + 1, subset, results);
// 不选 nums[index]
subset.remove(subset.size() - 1);
dfs(nums, index + 1, subset, results);
}
}
class Solution2 {
/**
* @param S: A set of numbers.
* @return: A list of lists. All valid subsets.
*/
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> results = new ArrayList<>();
if (nums == null) {
return results;
}
if (nums.length == 0) {
results.add(new ArrayList<Integer>());
return results;
}
Arrays.sort(nums);
helper(new ArrayList<Integer>(), nums, 0, results);
return results;
}
// 递归三要素
// 1. 递归的定义:在 Nums 中找到所有以 subset 开头的的集合,并放到 results
private void helper(ArrayList<Integer> subset,
int[] nums,
int startIndex,
List<List<Integer>> results) {
// 2. 递归的拆解
// deep copy
// results.add(subset);
results.add(new ArrayList<Integer>(subset));
for (int i = startIndex; i < nums.length; i++) {
// [1] -> [1,2]
subset.add(nums[i]);
// 寻找所有以 [1,2] 开头的集合,并扔到 results
helper(subset, nums, i + 1, results);
// [1,2] -> [1] 回溯
subset.remove(subset.size() - 1);
}
// 3. 递归的出口
// return;
}
}
public class Solution3 {
/*
* @param nums: A set of numbers
* @return: A list of lists
*/
public List<List<Integer>> subsets(int[] nums) {
// List vs ArrayList (google)
List<List<Integer>> results = new LinkedList<>();
if (nums == null) {
return results; // 空列表
}
Arrays.sort(nums);
// BFS
/**
[]
[1] [2] [3]
[1, 2] [1, 3] [2, 3]
[1, 2, 3]
**/
Queue<List<Integer>> queue = new LinkedList<>();
queue.offer(new LinkedList<Integer>());
while (!queue.isEmpty()) {
List<Integer> subset = queue.poll();
results.add(subset);
for (int i = 0; i < nums.length; i++) {
if (subset.size() == 0 || subset.get(subset.size() - 1) < nums[i]) {
List<Integer> nextSubset = new LinkedList<Integer>(subset);
nextSubset.add(nums[i]);
queue.offer(nextSubset);
}
}
}
return results;
}
}
Last updated