【LeetCode热题100】【回溯】子集

题目链接:78. 子集 - 力扣(LeetCode)

要找所有的子集

方法一:二进制状态法

子集就是对于每个元素来说,要么选它要么不选它,用0和1来表示,n个元素就有2的n次方个状态

可以从0数到2的n次方减一,左移再和1做与运算取它对应的位看看是不是1,是1就加上去

复制代码
class Solution {
public:
    vector<vector<int> > ans;

    vector<vector<int> > subsets(vector<int> &nums) {
        int n = nums.size();
        for (int binary = 0; binary < 1 << n; ++binary) {
            vector<int> son;
            for (int i = 0; i < n; i++) {
                if (binary >> i & i)
                    son.push_back(nums[i]);
            }
            ans.push_back(std::move(son));
        }
        return ans;
    }
};

方法二:递归

对于一个子集来说,这个元素它要么不选,是一个子集,要么选,也是一个子集

复制代码
class Solution {
public:
    vector<vector<int> > ans;
    vector<int> nums;
    vector<int> array;

    void dfs(int depth) {
        if (depth == nums.size()) {
            ans.push_back(array);
            return;
        }
        array.push_back(nums[depth]);
        dfs(depth + 1);
        array.pop_back();
        dfs(depth + 1);
    }

    vector<vector<int> > subsets(vector<int> &nums) {
        this->nums = nums;
        dfs(0);
        return ans;
    }
};
相关推荐
算AI13 小时前
人工智能+牙科:临床应用中的几个问题
人工智能·算法
hyshhhh15 小时前
【算法岗面试题】深度学习中如何防止过拟合?
网络·人工智能·深度学习·神经网络·算法·计算机视觉
杉之16 小时前
选择排序笔记
java·算法·排序算法
烂蜻蜓16 小时前
C 语言中的递归:概念、应用与实例解析
c语言·数据结构·算法
OYangxf16 小时前
图论----拓扑排序
算法·图论
我要昵称干什么16 小时前
基于S函数的simulink仿真
人工智能·算法
AndrewHZ17 小时前
【图像处理基石】什么是tone mapping?
图像处理·人工智能·算法·计算机视觉·hdr
念九_ysl17 小时前
基数排序算法解析与TypeScript实现
前端·算法·typescript·排序算法
守正出琦17 小时前
日期类的实现
数据结构·c++·算法
ChoSeitaku17 小时前
NO.63十六届蓝桥杯备战|基础算法-⼆分答案|木材加工|砍树|跳石头(C++)
c++·算法·蓝桥杯