您的位置:首页 > 新闻 > 资讯 > 衡阳新闻头条最新消息_管理平台_磁力搜索引擎下载_外链推广网站

衡阳新闻头条最新消息_管理平台_磁力搜索引擎下载_外链推广网站

2025/7/22 17:38:38 来源:https://blog.csdn.net/yaodec/article/details/145503058  浏览:    关键词:衡阳新闻头条最新消息_管理平台_磁力搜索引擎下载_外链推广网站
衡阳新闻头条最新消息_管理平台_磁力搜索引擎下载_外链推广网站

这道题的难点就在于题目所给的集合中有重复的数字,我们需要进行去重操作。首先明确去重指的是去重哪一部分。注意并不是对递归的集合去重,而是对当前集合的遍历进行去重。这么说可能有点抽象,举个例子:假设集合为1,1,2,3,4,我们第一次选1,递归集合时,我们仍可以选择第二个1。但是在第一次选第二个1时,在往下选,就会出现很多与第一次选第一个1时相同的组合。所以在每一层递归函数的for循环中我们需要进行去重。不过,我们需要判断这个重复出现的数字是在当前这层递归的for循环中还是在下一层递归的for循环中。于是,我们创建了一个数组,标识这些集合中的数字是否被使用过,如果被使用过,说明是在上一层递归中被使用,如果没有被使用,说明是在当前这一层递归的for循环中。大家可以结合我下面的代码及详细注释理解。

代码及详细注释如下:

class Solution {
public:vector<int> path;vector<vector<int>> result;void backtracking(vector<int>& candidates,int target,int sum,int start,vector<int>& used){//剪枝if(sum > target){return;}//终止条件if(sum == target){result.push_back(path);return;}for(int i = start;i < candidates.size();i++){//去重if(i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == 0){continue;}path.push_back(candidates[i]);sum += candidates[i];used[i] = 1;backtracking(candidates,target,sum,i + 1,used);//回溯path.pop_back();sum -= candidates[i];used[i] = 0;}return;}vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {//创建一个数组,该数组下标对应集合中元素的下标,表示集合中各个下标对应的数字有没有使用过vector<int> used(candidates.size(),0);sort(candidates.begin(),candidates.end());backtracking(candidates,target,0,0,used);return result;}
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com