子集


题目描述

给定一组不含重复元素的整数数组 nums ,返回该数组所有可能的子集(幂集)。

说明

解集不能包含重复的子集。


示例

说明:

  • 输入
    • 第一行输入数组元素个数
    • 第二行输入数组各个元素
  • 输出
    • 打印输出该数组所有的子集

示例

输入:
3
1 2 3

输出:
[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

题解

本题可以采用子集树的思想处理。

对于其中某个子集来说,任意一个元素要么在这个集合中,要么不在,可以使用一位二进制数来标记,1 代表在,0 代表不在。这样可以取 ({0 - 2^N}) (N 为数组元素个数) 表示每一个子集,每一个数的二进制数的每一位标识数组中每一个数的状态。这样遍历一遍即可找出所有子集。

此题也可以利用递归和回溯法求解。


代码

#include <iostream>
#include <vector>

using namespace std;

vector<vector<int> > sub_sets(vector<int> nums)
{
    vector<vector<int> > ans;
    vector<int> v;
    int max = (1 << nums.size());
    for (int i = 0, j = 0, k = 0; i < max; i++) {
        v.clear();
        for (j = i, k = 0; j > 0; j >>= 1)
        {
            if ((j & 1) == 1)
            {
                v.push_back(nums[k]);
            }
            k++;
        }
        ans.push_back(v);
    }
    return ans;
}

int main()
{
    int n = 0, num = 0;
    vector<int> nums;
    cin >> n;
    while (n--)
    {
        cin >> num;
        nums.push_back(num);
    }
    vector<vector<int> > sets = sub_sets(nums);
    vector<int> v;

    cout << "[" << endl;
    for (unsigned int i = 0, j = 0; i < sets.size(); i++)
    {
        v = sets[i];
        cout << "  [";
        for (j = 0; j < v.size(); j++)
        {
            cout << v[j] << ",";
        }
        cout << "]," << endl;
    }
}

返回顶部

原文地址:https://www.cnblogs.com/peabits/p/10908979.html