leetcode 39. 组合总和 思考分析
目录
- 1、题目
- 2、思考分析
- 3、未经优化代码
- 4、剪枝优化
1、题目
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
2、思考分析
解空间树宽度部分即数组 candidates内集合,深度取决于target.
一开始的重复元素理解错误了,每层循环都从0开始:
for(int i=0;i<=candidates.size();i++)
这样是不对的,会产生重复组合。
我们仍然需要采用startindex作为for起始位置,不过对于下一层我们的startindex不是startindex+1,而是仍然是startindex,这样才能重复取相同元素。
图1 for从0开始 | 图2 for从i开始 |
3、未经优化代码
class Solution {public:vector<vector<int>> result;vector<int> res;int sum;void clear_solution_param(){result.clear();res.clear();sum=0;}void backtracking(vector<int>& candidates,int startindex,int n){ if(sum > n) return;if(sum == n){result.push_back(res);return;}for(int i=startindex;i<candidates.size();i++){//处理结点;res.push_back(candidates[i]);sum+=candidates[i];//递归,探索下一层backtracking(candidates,i,n); //递归sum-=candidates[i];//回溯,撤销处理结果res.pop_back();}}vector<vector<int>> combinationSum(vector<int>& candidates, int target) {clear_solution_param();backtracking(candidates,0,target);return result;}
};
4、剪枝优化
先对数组进行排序,这样集合元素排列就是有序的了,方便剪枝。(这个在回溯法中经常用到)
对于同一层的for循环,如果sum加上此时的候选元素的和大于target则没有必要继续深入下去了。
class Solution {public:vector<vector<int>> result;vector<int> res;int sum;void clear_solution_param(){result.clear();res.clear();sum=0;}void backtracking(vector<int>& candidates,int startindex,int n){ if(sum > n) return;if(sum == n){result.push_back(res);return;}for(int i=startindex;i<candidates.size();i++){//由于输入的数组是有序的,所以直接进行剪枝。如果sum加上这个集合元素大于目标,此层就不需要往后看了,因为后面的元素加上sum肯定大于目标if(sum+candidates[i]>n) break;//处理结点;res.push_back(candidates[i]);sum+=candidates[i];//递归,探索下一层backtracking(candidates,i,n); //递归sum-=candidates[i];//回溯,撤销处理结果res.pop_back();}}vector<vector<int>> combinationSum(vector<int>& candidates, int target) {clear_solution_param();//排序加速剪枝sort(candidates.begin(),candidates.end());backtracking(candidates,0,target);return result;}
};
leetcode 39. 组合总和 思考分析相关推荐
- LeetCode 39 组合总和
LeetCode 39 组合总和 题目描述 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合.can ...
- leetcode 39. 组合总和 40. 组合总和 II
leetcode 39. 组合总和 40. 组合总和 II 组合总和 给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和 ...
- LeetCode 39. 组合总和(排列组合 回溯)
1. 题目 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无 ...
- leetcode - 39. 组合总和
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限制重复被选 ...
- leetcode 39. 组合总和
执行用时:4 ms, 在所有 C++ 提交中击败了91.98%的用户 内存消耗:10.5 MB, 在所有 C++ 提交中提交中击败了90.06%的用户 给你一个无重复元素的整数数组 candidate ...
- 【回溯算法】【打卡第179道】:leetCode :39. 组合总和(数组中的元素可以重复使用)
1.题目描述 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有不同组合 ,并以列表形式 ...
- Leetcode 39 组合总和 (每日一题 20210806)
给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和为目标数 target 的唯一组合.candidates 中的数字可以 ...
- leetcode —— 39. 组合总和
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合.candidates 中的数字可以无限制重复被选取 ...
- LeetCode 39. 组合总和(回溯+剪枝)
题目描述 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限 ...
最新文章
- Python加密—RSA加密
- AltiumDesigner17快捷键
- AcWing 1813. 方块游戏(暴力枚举)
- chrome 通过插件来监控zabbix
- Exchange+SP2的安装
- MT4红绿柱黄白线双线MACD指标
- KK音标和国际音标的对照
- angular 脏值检测基础流程
- 我的世界java版如何装mod_《我的世界》怎么装mod 安装方法教程
- 熵权法stata程序
- 阿里巴巴国际站 网站和PC客户端都登录不了,其他电脑或手机可以
- 微型计算机的alu部件包含在什么中,【单选题】微型计算机的ALU部件包括在( )之中。A. 存储器 B. I/O接口 C. O/I接口 D. CPU...
- 伟景行citymaker-----01.javascript打开本地模型CEP,加载目录树,加载要素类
- Java集合框架笔记,足够深,足够全面
- 【Unity】Unity实现鼠标控制摄像机围绕物体旋转镜头 滑轮控制远近
- 学生网课网页设计成品 在线视频学习类网页制作 三层结构网页模板 静态HTML注册登录网页模板 学生毕业设计网页制作作品 网校类网页代制做
- 14.刚体组件Rigidbody
- android中shape资源定义,Android可绘制对象资源之shape和layer-list使用
- 远程命令/代码执行漏洞(RCE)总结
- H5IOSAndroid-入坑指南
热门文章
- Java tree set_Java TreeSet tailSet()方法
- palapaweb怎样开启服务_为什么说微服务,要从前后端分离开始?一文带你揭秘深入微服务...
- echarts 卡_图表太丑怎么破,ECharts神器带你飞!
- 【APICloud系列|30】UILoading 模块demo源码的实现
- js sort方法根据数组中对象的某一个属性值进行排序(实用方法)
- vue2.0 element-ui中的el-select选择器无法显示选中的内容
- 原型 - 实现自己的jQuery
- Python萌新笔记
- 010 pandas的DataFrame
- 常见的linux命令及其翻译