每日LeetCode —— 78. 子集

89 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情

题目描述

       给定一个整数数组nums,数组里的元素互不相同,要求返回该数组的所有子集,注意,在这里空集是所有集合的子集。

例1:输入:nums=[2,8,9]  输出:[[2,8,9],[2,8],[2,9],[2],[8,9],[8],[9],[]]

本题值得注意的地方

  • 对所返回的子集的顺序不做要求,可以是任意顺序。
  • 注意空集的情况
  • 所返回的子集不能有重复的

原题地址:78. 子集

解题思路

       这种寻找所有符合要求的子集类型的题目可以使用深搜来解决,没搜索到一个元素的位置的时候,我们可以做出的选择有选择该元素与不选择该元素。

       如上面例1所给的输入为例,我们默认当搜索到一个位置时,先选择该元素作为子集,然后继续向下搜索,当这种情况搜索完成后,此时将我们所有得到的结果存储到一个指定的变量中去,然后再去搜索不选择该元素作为子集的情况。

       这里我们在搜索时用一个变量m来标识此刻我们所要操作的元素的位置。用vecror来存储选择的元素,选择当前元素这种情况递归完成后,把当前元素从vector中移除,再去递归不选择该元素的情况。

实现代码

class Solution {
public:
    // 存储所有的子集
    vector<vector<int>> res;
    void dfs(vector<int>& nums,vector<int>& vec,int m){
        // 若当前要操作的位置超过所给数组的最大索引,则将该种选择情况的子集加入res中
        if(m==nums.size()){
            res.push_back(vec);
            return ;
        }
        // 选择该元素作为子集后
        vec.push_back(nums[m]);
        dfs(nums,vec,m+1);
        // 不选择该元素作为子集
        vec.pop_back();
        dfs(nums,vec,m+1);
    }
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<int> vec;
        dfs(nums,vec,0);
        return res;
    }
};