LeetCode_Subsets

Given a set of distinct integers, S, return all possible subsets.
 
Note:
 
Elements in a subset must be in non-descending order.
The solution set must not contain duplicate subsets.
For example,
If S = [1,2,3], a solution is:
 
[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

  DFS 的简单应用 : 求组合

复制代码
class Solution {
public:
  void  DFS(vector<int> &S, vector<int> &temp,int n, int size,int start)
    {
    
        if(n == size)
        {
            result.push_back(temp);
            return ;
        }
        if(n > size)
            return ;
        
        for(int i = start; i< len ;i++)
        {
            if(flag[i] == false)
            {
                flag[i] = true;
                temp.push_back(S[i]);
                DFS(S, temp, n+1, size,i+1);
                temp.pop_back();
                flag[i] = false;
            }
        }
    
    }
    vector<vector<int> > subsets(vector<int> &S) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        result.clear();
        len = S.size();
        flag.resize(len,false);
        vector<int> temp;
        result.push_back(temp) ;
        sort(S.begin(), S.end());
        
        for(int i = 1; i <= len ; i++)
             DFS(S, temp,0, i,0);
             
        return result;
    }
private:
    vector<vector<int> > result ;
    vector<bool> flag;
    int len;
};
复制代码

 解释下start,因为组合和排列不同,组合不考虑排序,所以必须给元素进入temp指定一个次序,这个规则定义就是通过start,这样保证temp是有序的,也就保证result中没有重复

重写后的代码:

复制代码
class Solution {
public:
    void DFS(vector<int> &S, int currentSize, int length, int currentPos, vector<int> &ans)
    {
    
        if(length == currentSize){
        
            res.push_back(ans);
            return;
        }
        for(int i = currentPos; i < S.size(); i++)
        {
            ans.push_back(S[i]);
            DFS(S, currentSize, length + 1, i+1, ans);
            ans.pop_back();
        }
    }
    vector<vector<int> > subsets(vector<int> &S) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        sort(S.begin(), S.end());
        res.clear();
        vector<int> empt;
        res.push_back(empt);
        for(int i = 1; i <= S.size(); i++)
        {
            vector<int> ans;
            DFS(S, i, 0, 0, ans);
        }
        
        return res;
    }
private:
    vector<vector<int>> res;
};
复制代码

 

posted @   冰点猎手  阅读(249)  评论(0编辑  收藏  举报
编辑推荐:
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
阅读排行:
· C# 中比较实用的关键字,基础高频面试题!
· .NET 10 Preview 2 增强了 Blazor 和.NET MAUI
· 为什么AI教师难以实现
· 如何让低于1B参数的小型语言模型实现 100% 的准确率
· AI Agent爆火后,MCP协议为什么如此重要!
点击右上角即可分享
微信分享提示