欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > leetcode 39. Combination Sum和40. Combination Sum II

leetcode 39. Combination Sum和40. Combination Sum II

2025/5/28 18:26:26 来源:https://blog.csdn.net/weixin_41554427/article/details/148211777  浏览:    关键词:leetcode 39. Combination Sum和40. Combination Sum II

目录

39. Combination Sum

40. Combination Sum II

不使用used数组去重:

使用used数组去重:


39. Combination Sum

class Solution {vector<vector<int>> res;vector<int> com;int sum = 0;
public:vector<vector<int>> combinationSum(vector<int>& candidates, int target) {backtracking(0,candidates,target);return res;}void backtracking(int start,vector<int>& candidates, int target){if(sum >= target){if(sum == target)res.push_back(com);return;}for(int i = start;i < candidates.size();i++){if(sum + candidates[i] > target)continue;com.push_back(candidates[i]);sum += candidates[i];backtracking(i,candidates,target);//candidates[i]可以重复使用,所以这里的start要传入icom.pop_back();sum -= candidates[i];}}
};

40. Combination Sum II

本题关键是去重。

不使用used数组去重:

去重条件是

 if(i > start && candidates[i] == candidates[i-1])//本题的关键,树层去重continue;
class Solution {vector<vector<int>> res;vector<int> com;int sum = 0;
public:vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {sort(candidates.begin(),candidates.end());//后面去重是需要先对candidates排序backtracking(candidates,target,0);return res;}void backtracking(vector<int>& candidates,int target,int start){if(sum >= target){if(sum == target)res.push_back(com);return;}for(int i = start;i < candidates.size();i++){if(i > start && candidates[i] == candidates[i-1])//本题的关键,树层去重continue;if(sum + candidates[i] > target)continue;com.push_back(candidates[i]);sum += candidates[i];backtracking(candidates,target,i+1);com.pop_back();sum -= candidates[i];}}
};

使用used数组去重:

去重条件是:

            if(i > 0 && candidates[i] == candidates[i-1] && used[i-1] == false)//本题的关键,树层去重continue;

class Solution {vector<vector<int>> res;vector<int> com;int sum = 0;vector<bool> used;
public:vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {sort(candidates.begin(),candidates.end());//后面去重是需要先对candidates排序used.resize(candidates.size(),false);backtracking(candidates,target,0);return res;}void backtracking(vector<int>& candidates,int target,int start){if(sum >= target){if(sum == target)res.push_back(com);return;}for(int i = start;i < candidates.size();i++){// used[i - 1] == true,说明同一树枝candidates[i - 1]使用过// used[i - 1] == false,说明同一树层candidates[i - 1]使用过// 要对同一树层使用过的元素进行跳过if(i > 0 && candidates[i] == candidates[i-1] && used[i-1] == false)//本题的关键,树层去重continue;if(sum + candidates[i] > target)continue;com.push_back(candidates[i]);sum += candidates[i];used[i] = true;backtracking(candidates,target,i+1);com.pop_back();sum -= candidates[i];used[i] = false;}}
};

版权声明:

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

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

热搜词