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;
    }
};
相关推荐
Wendy14417 小时前
【线性回归(最小二乘法MSE)】——机器学习
算法·机器学习·线性回归
拾光拾趣录7 小时前
括号生成算法
前端·算法
渣呵8 小时前
求不重叠区间总和最大值
算法
浮生带你学Java8 小时前
2025Java面试题及答案整理( 2025年 7 月最新版,持续更新)
java·开发语言·数据库·面试·职场和发展
拾光拾趣录8 小时前
链表合并:双指针与递归
前端·javascript·算法
好易学·数据结构8 小时前
可视化图解算法56:岛屿数量
数据结构·算法·leetcode·力扣·回溯·牛客网
香蕉可乐荷包蛋10 小时前
AI算法之图像识别与分类
人工智能·学习·算法
chuxinweihui10 小时前
stack,queue,priority_queue的模拟实现及常用接口
算法
tomato0910 小时前
河南萌新联赛2025第(一)场:河南工业大学(补题)
c++·算法
墨染点香10 小时前
LeetCode Hot100【5. 最长回文子串】
算法·leetcode·职场和发展