题目描述
给定一个含不同整数的集合,返回其所有的子集。
子集中的元素排列必须是非降序的,解集必须不包含重复的子集。
样例1
输入:[0]
输出:
[
[],
[0]
]
样例2
输入:[1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
java题解
public class Solution {
/**
* @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);
}
}
C++题解
class Solution {
private:
void helper(vector<vector<int> > &results,
vector<int> &subset,
vector<int> &nums,
int start) {
results.push_back(subset);
for (int i = start; i < nums.size(); i++) {
subset.push_back(nums[i]);
helper(results, subset, nums, i + 1);
subset.pop_back();
}
}
public:
vector<vector<int> > subsets(vector<int> &nums) {
vector<vector<int> > results;
vector<int> subset;
sort(nums.begin(), nums.end());
helper(results, subset, nums, 0);
return results;
}
};
python题解
class Solution:
def search(self, nums, S, index):
if index == len(nums):
self.results.append(list(S))
return
S.append(nums[index])
self.search(nums, S, index + 1)
S.pop()
self.search(nums, S, index + 1)
def subsets(self, nums):
self.results = []
self.search(sorted(nums), [], 0)
return self.results