本文共 1051 字,大约阅读时间需要 3 分钟。
LeetCode 78:生成所有子集
给定一个包含互不相同元素的集合,返回它的所有子集。结果不能包含相同的子集。
我们可以利用二进制数的特性来生成所有可能的子集。每个二进制数的每一位表示是否包含集合中的一个元素。例如,集合 {1, 2, 3} 中的数字 3(二进制 11)表示包含元素 1 和 2。
具体步骤如下:
#includeusing namespace std;vector > subsets(vector nums) { vector > res; int n = nums.size(); for (int i = 0; i < (1 << n); ++i) { vector temp; for (int j = 0; j < n; ++j) { if (i >> j & 1) { temp.push_back(nums[j]); } } res.push_back(temp); } return res;}
vector<vector<int>> res;
用于存储所有子集。int n = nums.size();
获取集合的大小。for (int i = 0; i < (1 << n); ++i)
,循环从 0 到 2^n - 1。vector<int> temp;
作为临时存储子集的空间。for (int j = 0; j < n; ++j)
,检查 i 的第 j 位是否为 1。if (i >> j & 1)
,如果第 j 位为 1,则将 nums[j] 添加到 temp。res.push_back(temp);
。这种方法通过生成所有可能的二进制数来构建子集,确保每个子集都是唯一的,时间复杂度为 O(n * 2^n),适用于小规模的集合。
转载地址:http://defwz.baihongyu.com/