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();
    }
};
相关文章
|
11月前
|
网络协议 安全 Linux
Linux C/C++之IO多路复用(select)
这篇文章主要介绍了TCP的三次握手和四次挥手过程,TCP与UDP的区别,以及如何使用select函数实现IO多路复用,包括服务器监听多个客户端连接和简单聊天室场景的应用示例。
277 0
|
11月前
|
存储 算法
Leetcode第三题(无重复字符的最长子串)
这篇文章介绍了解决LeetCode第三题“无重复字符的最长子串”的算法,使用滑动窗口技术来找出给定字符串中最长的不含重复字符的子串,并提供了详细的代码实现和解释。
528 0
Leetcode第三题(无重复字符的最长子串)
|
11月前
|
C++
Leetcode第54题(螺旋矩阵)
这篇文章介绍了LeetCode第54题“螺旋矩阵”的解题思路和C++的实现代码,该题目要求按照顺时针螺旋顺序返回给定矩阵中的所有元素。
120 1
Leetcode第54题(螺旋矩阵)
|
11月前
|
C++
Leetcode第56题(合并区间)
这篇文章介绍了LeetCode第56题“合并区间”的解题方法,通过排序和贪心策略合并重叠区间,并提供了C++的代码实现。
175 0
Leetcode第56题(合并区间)
|
11月前
|
存储 算法 C++
LeetCode第二题(两数相加)
这篇文章是关于LeetCode上第二题“两数相加”的题解,其中详细描述了如何使用C++语言来实现将两个逆序存储的非负整数链表相加,并返回结果链表的算法。
113 0
LeetCode第二题(两数相加)
|
11月前
|
算法
Leetcode第46题(全排列)
这篇文章介绍了LeetCode第46题“全排列”的解题方法,使用深度优先搜索(DFS)和回溯算法来生成给定数组的所有可能排列。
144 0
Leetcode第46题(全排列)
|
11月前
|
内存技术
解码AAC裸流为PCM写入文件
使用FFmpeg库将AAC裸流解码为PCM数据并写入文件的过程。
170 4
|
11月前
|
API
FFmpeg中AVPacket、AVFrame结构的基本使用
FFmpeg中AVPacket和AVFrame结构的内存分配、释放和引用计数处理,以及如何避免内存泄漏。
299 3
|
11月前
|
编解码
解码AVC(h264)裸流为yuv420P写入文件
本文介绍了如何使用FFmpeg库解码AVC(H.264)裸流为YUV420P格式并写入文件的过程。
112 2
|
11月前
|
编解码
从mp4、flv、ts文件中提取出AVC(h264)
使用FFmpeg从mp4、flv、ts等封装格式的文件中提取AVC(H.264)视频流,并将其写入文件。
183 1