集合中的子集(三种方法)

来源:互联网 发布:如何使用万方数据库 编辑:程序博客网 时间:2024/06/05 05:53
    给定一个集合,求出这个集合的所有子集,比如:集合{1,2,3},子集为{},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}。
    解法一:递归
void subsets(vector<vector<int>> &res, vector<int> &path,vector<int> &nums, int start){res.push_back(path);for (int i = start; i < nums.size(); ++i){path.push_back(nums[i]);subsets(res, path, nums, i + 1);path.pop_back();}}vector<vector<int>> subsets(vector<int>& nums) {vector<vector<int>> res;vector<int> path;subsets(res, path, nums, 0);return res;}
解法二:循环
vector<vector<int>> subsets(vector<int>& nums) {vector<vector<int>> res = { {} };for (int i = 0; i < nums.size(); ++i){int size = res.size();for (int j = 0; j < size; ++j){res.push_back(res[j]);res[j].push_back(nums[i]);}}return res;}
解法三:位向量
vector<vector<int>> subsets(vector<int>& nums) {vector<vector<int>> res;if (nums.empty())return res;int size = nums.size();int num = pow(2, size);res.resize(num);for (int i = 0; i < size; ++i){for (int j = 0; j < num; ++j){if ((j >> i) & 1){res[j].push_back(nums[i]);}}}return res;}
0 0
原创粉丝点击