题目链接
Leetcode.78 子集
mid
题目描述
给你一个整数数组 n u m s nums nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入:nums = [0]
输出:[[],[0]]
提示:
- 1 < = n u m s . l e n g t h < = 10 1 <= nums.length <= 10 1<=nums.length<=10
- − 10 < = n u m s [ i ] < = 10 -10 <= nums[i] <= 10 −10<=nums[i]<=10
- n u m s nums nums 中的所有元素 互不相同
解法一:二进制枚举
我们设 n n n 是 n u m s nums nums 的 s i z e size size,那么 n u m s nums nums 的子集一共有 2 n 2^n 2n 个,我们直接枚举所有的子集即可。
时间复杂度: O ( n × 2 n ) O(n \times 2^n) O(n×2n)
C++代码:
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
int n = nums.size() , m = 1 << n;
vector<vector<int>> ans;
for(int mask = 0;mask < m;mask++){
vector<int> temp;
for(int j = 0;j < n;j++){
if((mask >> j) & 1) temp.emplace_back(nums[j]);
}
ans.emplace_back(temp);
}
return ans;
}
};
解法二:回溯
对于每一个 n u m s [ u ] nums[u] nums[u] ,我们有 选 和 不选 两种情况,直接使用回溯即可。
时间复杂度: O ( n × 2 n ) O(n \times 2^n) O(n×2n)
C++代码:
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> ans;
int n = nums.size();
function<void(int,vector<int>&)> dfs = [&](int u,vector<int>& path) ->void{
if(u >= n){
ans.emplace_back(path);
return;
}
//选nums[u]
path.emplace_back(nums[u]);
dfs(u + 1,path);
//不选
path.pop_back();
dfs(u + 1,path);
};
vector<int> path;
dfs(0,path);
return ans;
}
};