Leetcode第40题(组合总和2)

简介: LeetCode第40题“组合总和II”的解题方法,使用了回溯法来找出所有可能的组合,并对重复元素进行了处理。

题目描述:

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用 一次 。

注意:解集不能包含重复的组合。

示例 1:

输入: candidates = [10,1,2,7,6,1,5], target = 8,
输出:[[1,1,6],[1,2,5],[1,7],[2,6]]
示例 2:

输入: candidates = [2,5,2,1,2], target = 5,
输出:[[1,2,2],[5]]

class Solution {
    vector<vector<int>> ans;
    vector<int> combine;
public:
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        sort(candidates.begin(),candidates.end());
        dfs(candidates,target,0);
        return ans;
    }

    void dfs(vector<int>& candidates,int target,int idx){
        //target == 0
        if(target == 0){
            ans.push_back(combine);
            return;
        }
        //idx == candidates.size()
        if(idx == candidates.size()) return;

        //统计相同元素的个数
        int cnt = 1;
        while(idx + 1 < candidates.size() && candidates[idx] == candidates[idx + 1]){
            cnt++;
            idx++;
        }
        //避免重复
        for(int i = 0;i <= cnt && target >= i * candidates[idx];i++){
            dfs(candidates,target - i * candidates[idx],idx + 1);
            combine.push_back(candidates[idx]);
        }
        for(int i = 0;i <= cnt && target >= i * candidates[idx];i++)
            combine.pop_back();
    }
};
AI 代码解读
相关文章
api接口如何对接?(带你了解api接口的相关知识)
API接口是在产品和研发领域广泛应用的专业术语,主要用于公司内部系统衔接及公司间合作。本文将详细讲解API接口的概念、必要性及其核心要素。首先介绍API接口的基本原理与应用场景,随后阐述其重要性,最后解析API接口的核心组成部分,帮助读者深入理解API接口的工作机制。适合产品小白和求职者阅读,提升专业知识。
(2)Qt中的字符串类型
本文介绍了Qt中的字符串类型QByteArray和QString,包括它们的构造函数、数据操作方法、查找操作、遍历操作以及与其他类型之间的转换,并解释了它们之间的区别。
456 5
(2)Qt中的字符串类型
|
9月前
(8)Qt中的自定义信号
本文介绍了如何在Qt框架中创建和使用自定义信号,并通过一个父子窗口切换的示例来展示自定义信号的实现和应用。
288 3
(8)Qt中的自定义信号
Linux C/C++之IO多路复用(aio)
这篇文章介绍了Linux中IO多路复用技术epoll和异步IO技术aio的区别、执行过程、编程模型以及具体的编程实现方式。
347 1
Linux C/C++之IO多路复用(aio)
|
9月前
(14)Qt绘图(one)
本文介绍了在Qt中使用QPainter进行绘图的基础操作,包括如何指定绘图设备、使用QPen和QBrush设置线条和填充样式、绘制不同样式的线条和形状,以及如何实现纹理填充和渐变填充等效果。
132 6
(14)Qt绘图(one)
(13) Qt事件系统(two)
文章详细介绍了Qt事件系统,包括事件分发、自定义事件、事件传播机制、事件过滤以及事件与信号的区别。
335 3
(13) Qt事件系统(two)
|
9月前
(7)Qt中的自定义槽(函数)
这篇文章介绍了在Qt中如何定义和使用自定义槽函数,包括类成员函数、静态类成员函数、全局函数和lambda表达式作为槽函数的示例,以及使用lambda表达式时的注意事项。
240 2
(7)Qt中的自定义槽(函数)
|
9月前
SDL事件处理以及线程使用(2)
SDL库中事件处理和多线程编程的基本概念和示例代码,包括如何使用SDL事件循环来处理键盘和鼠标事件,以及如何创建和管理线程、互斥锁和条件变量。
113 1
SDL事件处理以及线程使用(2)
|
9月前
SDL基础使用01(QtCreator)
如何在Qt Creator中创建一个C项目并使用SDL库来创建和显示一个简单的窗口。
189 1
SDL基础使用01(QtCreator)
|
9月前
|
API
FFmpeg中AVPacket、AVFrame结构的基本使用
FFmpeg中AVPacket和AVFrame结构的内存分配、释放和引用计数处理,以及如何避免内存泄漏。
223 3
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等