78. Subsets

绝地灬酷狼 2022-04-12 08:43 308阅读 0赞

Given a set of distinct integers, nums, return all possible subsets (the power set).

Note: The solution set must not contain duplicate subsets.

Example:

  1. Input: nums = [1,2,3]
  2. Output:
  3. [
  4. [3],
  5. [1],
  6. [2],
  7. [1,2,3],
  8. [1,3],
  9. [2,3],
  10. [1,2],
  11. []
  12. ]

方法一:回溯法。

  1. class Solution {
  2. public:
  3. vector<vector<int>> subsets(vector<int>& nums) {
  4. vector<vector<int>> result; //存储最终结果
  5. vector<int> item; //回溯时,产生各个子集的数组
  6. result.push_back(item);
  7. int i=0;
  8. generate(i, nums,item,result);
  9. return result;
  10. }
  11. private:
  12. void generate(int i,vector<int>& nums, vector<int>& item, vector<vector<int>> &result)
  13. {
  14. if(i>= nums.size())
  15. return;
  16. item.push_back(nums[i]); //添加当前元素
  17. result.push_back(item);
  18. generate(i+1, nums,item,result); //第一次递归调用
  19. item.pop_back(); //不添加当前元素
  20. generate(i+1, nums,item,result); //第二次递归调用
  21. }
  22. };

方法二:位运算法

  1. 用到了按位&和左移运算。假设原始集合\{a, b, c\},子集中a, b, c可能存在也可能不存在,假设1表示存在,0表示不存在。用三个二进制位分别表示a, b, c100表示a存在,010表示b存在,001表示c存在。这三种情况都可以通过1左移得到。
  2. 由组合数学可知,三个元素的集合,其子集有2^3种情况。遍历其中每一种情况,分别和100,010001按位&运算,如果结果为真,则子集中包含对应元素,否则不包含。
  3. class Solution {
  4. public:
  5. vector<vector<int>> subsets(vector<int>& nums) {
  6. vector<vector<int>> result; //存储最终结果
  7. int count = pow(2,nums.size());
  8. for(int i=0; i<count; i++)
  9. {
  10. vector<int> item;
  11. for(int j=0; j<nums.size(); j++)
  12. {
  13. if(i & (1<<j))
  14. {
  15. item.push_back(nums[j]);
  16. }
  17. }
  18. result.push_back(item);
  19. }
  20. return result;
  21. }
  22. };

发表评论

表情:
评论列表 (有 0 条评论,308人围观)

还没有评论,来说两句吧...

相关阅读