计算一个数组的子集

简介: 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

原题参照:Subset/子集


给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。


解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。


示例 1:


输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]


示例 2:


输入:nums = [0]
输出:[[],[0]]


解题思路


回溯法:确定子集是由长度为0~size个数字组成,所以就分别求对应长度所有的子集的交集,就是最终的子集。重点是一个判断条件temp.size()==0||(temp.size()>0&&temp[temp.size()-1]<nums[i]需要理解透。第一个子条件是确定子集中第一个数字,第二个条件是去除重复,防止出现子集数字重复,如[2,3]和[3,2]的情况。


样例代码,C++


vector<vector<int>> res;
vector<int> temp;
void backTracking(vector<int>& nums,int k){
    if(k==0){
        res.push_back({});
        return ;
    }
    else if(k==nums.size()){
        res.push_back(nums);
        return ;
    }
    if(temp.size()==k){
        res.push_back(temp);
        return ;
    }
    for(int i=0;i<nums.size();i++){
        if(temp.size()==0||(temp.size()>0&&temp[temp.size()-1]<nums[i])){
            temp.push_back(nums[i]);
            backTracking(nums,k);
            temp.pop_back();
        }
    }
}
vector<vector<int>> subsets(vector<int>& nums) {
    for(int i=0;i<=nums.size();i++){
        backTracking(nums,i);
    }
    return res;
}


目录
相关文章
|
8月前
|
存储 算法 程序员
【算法训练-回溯算法 二】【子集组合问题】子集、组合、子集II、组合总和
【算法训练-回溯算法 二】【子集组合问题】子集、组合、子集II、组合总和
70 0
|
8月前
|
算法 测试技术 C#
【线段树 区间位运算模板】3117划分数组得到最小的值之和
【线段树 区间位运算模板】3117划分数组得到最小的值之和
|
C语言
C 语言实例 - 计算数组元素平均值
C 语言实例 - 计算数组元素平均值
116 4
|
8月前
|
存储 算法 程序员
【算法训练-数组 一】【数组子集】:最长无重复子数组
【算法训练-数组 一】【数组子集】:最长无重复子数组
53 0
|
8月前
|
人工智能 算法 数据可视化
【算法训练-数组 五】【数组组合】:下一个排列
【算法训练-数组 五】【数组组合】:下一个排列
57 0
|
存储 Python
Python实现划分数组为连续数字的集合
Python实现划分数组为连续数字的集合
115 0
(转载) 数组a[]={3,5,2,4,1,8},要求从a中找出所有“和”等于10的子集
背包问题。     不过就这道题目本身而言,由于集合a中只要6个元素,而不是成千上万,所以可以使用更直观的办法:     只要你能通过程序给出数组a中元素所组成的集合的所有的子集合(幂集),那么只需在这些集合中搜索等于10的就可以了。
659 0
|
开发工具
数组的子集能否累加出K
数组的子集能否累加出K
数组的子集能否累加出K