子集

    xiaoxiao2022-07-14  165

    文章目录

    题目描述说明示例 题解代码


    题目描述

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

    说明

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


    示例

    输入 第一行输入数组元素个数第二行输入数组各个元素 输出 打印输出该数组所有的子集 输入: 3 1 2 3 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]

    题解

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

    对于其中某个子集来说,任意一个元素要么在这个集合中,要么不在,可以使用一位二进制数来标记,1 代表在,0 代表不在。这样可以取 0   2 < s u p > N < / s u p > ( N 为 数 组 元 素 个 数 ) {0 ~ 2<sup>N</sup>} (N 为数组元素个数) 0 2<sup>N</sup>(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; } }

    返回顶部

    最新回复(0)