题目:
给定一个整数数组 nums
,数组中的元素 互不相同 。返回该数组所有可能的子集。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例1:
输入:nums = [1,2,3] 输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例2:
输入:nums = [0] 输出:[[],[0]]
解法及思路:迭代法实现子集枚举
使用0/1表示子集中是否包含数组nums中的元素,若nums[i]在子集中,则对应0/1序列的第i位置1,若不在子集中,对应0/1序列的第i位置0。以数组{5,2,9}为例:
0/1序列 | 子集 | 0/1序列对应的二进制数 |
000 | {} | 0 |
001 | {9} | 1 |
010 | {2} | 2 |
011 | {2,9} | 3 |
100 | {5} | 4 |
101 | {5,9} | 5 |
110 | {5,2} | 6 |
111 | {5,2,9} | 7 |
由上表可以看出,对元素个数为3的数组,其所有子集对应的0/1序列的二进制数正好从0到。
代码实现:
class solution
{
public:
vector<int> temp;//存放子集
vector<vector<int>> ans;
vector<vector<int>> subsets(vector<int> &nums)
{
int n = nums.size();
for(int mask=0;mask<(1<<n);mask++)//2的n次方-1个数可以将所有子集枚举完毕
{
temp.clear();
for(int i=0;i<n;i++)
{
if(mask&(1<<i))
{
temp.push_back(nums[i]);//将对应1的位放入子集中
}
}
ans.push_back(temp);
}
return ans;
}
};
复杂度分析:
(1)时间复杂度:,因为枚举所有子集需要
个数进行循环,每个数要进行n次与操作,得到对应位的0/1值。
(2)空间复杂度:,其中temp需要临时存放元素个数最大为n的数组。
注:算法的存储量包括:程序本身所占用的空间、输入数据所占用的空间和辅助变量所占用的空间。空间复杂度是对一个算法在运行过程中临时占用的存储空间大小的度量。