计算一个数组的子集

简介: 给你一个整数数组 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;
}


目录
相关文章
|
5月前
|
存储 算法 程序员
【算法训练-回溯算法 二】【子集组合问题】子集、组合、子集II、组合总和
【算法训练-回溯算法 二】【子集组合问题】子集、组合、子集II、组合总和
42 0
|
5月前
|
人工智能 算法 数据可视化
【算法训练-数组 五】【数组组合】:下一个排列
【算法训练-数组 五】【数组组合】:下一个排列
23 0
|
5月前
|
存储 算法 程序员
【算法训练-数组 一】【数组子集】:最长无重复子数组
【算法训练-数组 一】【数组子集】:最长无重复子数组
23 0
|
5月前
|
C语言
C 语言实例 - 计算数组元素平均值
C 语言实例 - 计算数组元素平均值
44 4
|
9月前
|
存储 算法 JavaScript
设计并实现一个函数, 功能为给定一个存储为随机整数的数组,从中删除所有值为i的整数
设计并实现一个函数, 功能为给定一个存储为随机整数的数组,从中删除所有值为i的整数
|
11月前
|
存储 Python
Python实现划分数组为连续数字的集合
Python实现划分数组为连续数字的集合
76 0
|
11月前
|
存储 算法 前端开发
前端算法-除自身外数组的乘积
前端算法-除自身外数组的乘积
|
算法 BI C++