LeetCode_Subsets II

Given a collection of integers that might contain duplicates, 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,2], a solution is:

  

[
  [2],
  [1],
  [1,2,2],
  [2,2],
  [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(i != start && S[i] == S[i-1]) 
                  continue ;
            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> > subsetsWithDup(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;
};
复制代码

 解释下这句:”if(i != start && S[i] == S[i-1]) continue ; 这句话保证每个循环进入的元素不会有重复。start : 保证所有的元素进入的顺序为从左往右~

 

重写后的代码:

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

 

posted @   冰点猎手  阅读(218)  评论(0编辑  收藏  举报
编辑推荐:
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
阅读排行:
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· Vite CVE-2025-30208 安全漏洞
· 《HelloGitHub》第 108 期
· MQ 如何保证数据一致性?
· 一个基于 .NET 开源免费的异地组网和内网穿透工具
点击右上角即可分享
微信分享提示