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;
    }
};
相关推荐
沐苏瑶3 小时前
Java 搜索型数据结构全解:二叉搜索树、Map/Set 体系与哈希表
java·数据结构·算法
ZoeJoy84 小时前
算法筑基(二):搜索算法——从线性查找到图搜索,精准定位数据
算法·哈希算法·图搜索算法
Alicx.4 小时前
dfs由易到难
算法·蓝桥杯·宽度优先
_日拱一卒4 小时前
LeetCode:找到字符串中的所有字母异位词
算法·leetcode
云泽8085 小时前
深入 AVL 树:原理剖析、旋转算法与性能评估
数据结构·c++·算法
心软小念5 小时前
金三银四,全网最详细的软件测试面试题总结
软件测试·面试·职场和发展
Wilber的技术分享5 小时前
【LeetCode高频手撕题 2】面试中常见的手撕算法题(小红书)
笔记·算法·leetcode·面试
邪神与厨二病6 小时前
Problem L. ZZUPC
c++·数学·算法·前缀和
软件测试媛7 小时前
软件测试常见的面试题(46道)
功能测试·面试·职场和发展
梯度下降中7 小时前
LoRA原理精讲
人工智能·算法·机器学习