zoukankan      html  css  js  c++  java
  • Subsets -- LeetCode

    Given a set of distinct integers, nums, return all possible subsets.

    Note:

    • Elements in a subset must be in non-descending order.
    • The solution set must not contain duplicate subsets.

     

    For example,
    If nums = [1,2,3], a solution is:

    [
      [3],
      [1],
      [2],
      [1,2,3],
      [1,3],
      [2,3],
      [1,2],
      []
    ]

    思路:由于nums中每个数字都没有重复,因此该数字只有出现或不出现两种情况。

    这道题有三种方法来做。第一种是用dfs来遍历每一种情况。

     1 class Solution {
     2 public:
     3     void help(vector<vector<int> >& res, vector<int>& nums, vector<int> cand, int cur)
     4     {
     5         if (cur == nums.size())
     6         {
     7             res.push_back(cand);
     8             return;
     9         }
    10         help(res, nums, cand, cur + 1);
    11         cand.push_back(nums[cur]);
    12         help(res, nums, cand, cur + 1);
    13     }
    14     vector<vector<int>> subsets(vector<int>& nums) {
    15         sort(nums.begin(), nums.end());
    16         vector<vector<int> > res;
    17         vector<int> cand;
    18         help(res, nums, cand, 0);
    19         return res;
    20     }
    21 };

    第二种方法,用位运算。每一位表示nums数组中的一个数字是否出现。

     1 class Solution {
     2 public:
     3     vector<vector<int>> subsets(vector<int>& nums) {
     4         int tot = 1 << nums.size();
     5         vector<vector<int> > res;
     6         sort(nums.begin(), nums.end());
     7         for (int i = 0; i < tot; i++)
     8         {
     9             vector<int> tem;
    10             for (int j = 0; (1 << j) <= i; j++)
    11                 if ((1 << j) & i)
    12                     tem.push_back(nums[j]);
    13             res.push_back(tem);
    14         }
    15         return res;
    16     }
    17 };

     第三种是迭代。依次枚举每一个位置的数字,将其加到当前已有的所有子集的最后作为新的子集。

     1 class Solution {
     2 public:
     3     vector<vector<int>> subsets(vector<int>& nums) {
     4         sort(nums.begin(), nums.end());
     5         vector<vector<int>> subs(1, vector<int>());
     6         for (int i = 0; i < nums.size(); i++) {
     7             int n = subs.size();
     8             for (int j = 0; j < n; j++) {
     9                 subs.push_back(subs[j]); 
    10                 subs.back().push_back(nums[i]);
    11             }
    12         }
    13         return subs;
    14     }
    15 }; 
  • 相关阅读:
    THINKPHP3.2视频教程
    PHPCMS 学习
    PHPCMS 后台学习
    phpcms 模板学习
    二叉树的创建与遍历(链式存储)
    MySQL基础~~增、删、改、简单查
    队列的基本操作(链队列)
    MySQL基础~~表结构操作
    行编辑程序
    循环链表的基本操作
  • 原文地址:https://www.cnblogs.com/fenshen371/p/5162861.html
Copyright © 2011-2022 走看看