leetcode_40 组合总数II

1. 题意

找到所有可能的组合数,只是不能重复选择同一元素。

组合总数II

2. 题解

2.1 我的解法

在leetcode39的基础上,再加上一个标记数组即可。

cpp 复制代码
class Solution {
public:
    void gen(vector<vector<int>> &res, vector<int>& candidates, vector<int> &vis, 
        vector<int> &seq, int target)
        {
            if (target == 0) {
                res.push_back(seq);
                return ;
            }
            if ( target < 0)
                return;

            int sz = candidates.size();
            for ( int i = 0;i < sz; ++i) {
                
                if (vis[i]) continue;
                if (i && !vis[i - 1] && candidates[i] == candidates[i - 1])
                    continue;
                if ( !seq.empty() && candidates[i] < seq[seq.size() - 1] )
                    continue;
                
                vis[i] = 1;
                seq.push_back(candidates[i]);
                gen(res, candidates, vis, seq, target - candidates[i]);
                vis[i] =  0;
                seq.pop_back();


            }
        }

    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        

        vector< vector<int> > ans;
        vector<int> seq;
        vector<int> vis(candidates.size(), 0);

        sort(candidates.begin(), candidates.end());

        gen(ans, candidates, vis, seq, target);
        
        return ans;
    }
};
2.2 另一种可能的解法

其实不需要标记数组,根据有序数组的特点和begin来进行去重。

cpp 复制代码
class Solution {
public:
    void gen(vector<vector<int>> &res, vector<int>& candidates, 
        vector<int> &seq, int begin, int target)
        {
            if (target == 0) {
                res.push_back(seq);
                return ;
            }
            if ( target < 0)
                return;

            int sz = candidates.size();
            for ( int i = begin;i < sz; ++i) {
                
                if ( i > begin && candidates[i] == candidates[i - 1])
                    continue;

                seq.push_back(candidates[i]);
                gen(res, candidates, seq, i + 1,target - candidates[i]);
                seq.pop_back();


            }
        }

    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        

        vector< vector<int> > ans;
        vector<int> seq;
        vector<int> vis(candidates.size(), 0);

        sort(candidates.begin(), candidates.end());

        gen(ans, candidates,  seq, 0 ,target);
        
        return ans;
    }
};
相关推荐
Fanxt_Ja4 小时前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
侃侃_天下4 小时前
最终的信号类
开发语言·c++·算法
茉莉玫瑰花茶4 小时前
算法 --- 字符串
算法
博笙困了4 小时前
AcWing学习——差分
c++·算法
NAGNIP5 小时前
认识 Unsloth 框架:大模型高效微调的利器
算法
NAGNIP5 小时前
大模型微调框架之LLaMA Factory
算法
echoarts5 小时前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
Python技术极客5 小时前
一款超好用的 Python 交互式可视化工具,强烈推荐~
算法
徐小夕5 小时前
花了一天时间,开源了一套精美且支持复杂操作的表格编辑器tablejs
前端·算法·github
小刘鸭地下城5 小时前
深入浅出链表:从基础概念到核心操作全面解析
算法