LeetCode热题100 组合总和
题目描述给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target 找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同则两种组合是不同的。对于给定的输入保证和为 target 的不同组合数少于 150 个。示例 1输入candidates [2,3,6,7], target 7输出[[2,2,3],[7]]解释2 和 3 可以形成一组候选2 2 3 7 。注意 2 可以使用多次。7 也是一个候选 7 7 。仅有这两种组合。示例 2输入: candidates [2,3,5], target 8输出: [[2,2,2,2],[2,3,3],[3,5]]示例 3输入: candidates [2], target 1输出: []提示1 candidates.length 302 candidates[i] 40candidates 的所有元素 互不相同1 target 40思路1 进行dfs遍历每个数有选和不选两种情况。2 剪枝剪枝1超过目标值或者遍历完整个数组直接返回。剪枝2进行从小到大排序这样如果第i个超过范围了那么后面的都可以不用选了。代码classSolution{public:vectorvectorintcombinationSum(vectorintcandidates,inttarget){// 先做排序可以优化sort(candidates.begin(),candidates.end());// 单组答案vectorintres;// 多组答案vectorvectorintans;// 长度intncandidates.size();intpo0;// 不选第po个数, 要是后面的数大于目标值, 可以放弃了if(po1ncandidates[po1]target)dfs(candidates,po1,n,target,res,ans);// 选第po个数res.push_back(candidates[po]);dfs(candidates,po,n,target-candidates[po],res,ans);res.pop_back();returnans;}voiddfs(vectorintcandidates,intpo,intn,inttarget,vectorintres,vectorvectorintans){if(target0){ans.push_back(res);return;}if(target0||pon)return;// 不选第po个数, 要是后面的数大于目标值, 可以放弃了if(po1ncandidates[po1]target)dfs(candidates,po1,n,target,res,ans);// 选第po个数res.push_back(candidates[po]);dfs(candidates,po,n,target-candidates[po],res,ans);res.pop_back();}};
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2411266.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!