目录

  • 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. 组合总和 思考分析相关推荐

  1. LeetCode 39 组合总和

    LeetCode 39 组合总和 题目描述 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合.can ...

  2. leetcode 39. 组合总和 40. 组合总和 II

    leetcode 39. 组合总和 40. 组合总和 II 组合总和 给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和 ...

  3. LeetCode 39. 组合总和(排列组合 回溯)

    1. 题目 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无 ...

  4. leetcode - 39. 组合总和

    给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限制重复被选 ...

  5. leetcode 39. 组合总和

    执行用时:4 ms, 在所有 C++ 提交中击败了91.98%的用户 内存消耗:10.5 MB, 在所有 C++ 提交中提交中击败了90.06%的用户 给你一个无重复元素的整数数组 candidate ...

  6. 【回溯算法】【打卡第179道】:leetCode :39. 组合总和(数组中的元素可以重复使用)

    1.题目描述 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有不同组合 ,并以列表形式 ...

  7. Leetcode 39 组合总和 (每日一题 20210806)

    给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和为目标数 target 的唯一组合.candidates 中的数字可以 ...

  8. leetcode —— 39. 组合总和

    给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合.candidates 中的数字可以无限制重复被选取 ...

  9. LeetCode 39. 组合总和(回溯+剪枝)

    题目描述 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限 ...

最新文章

  1. Python加密—RSA加密
  2. AltiumDesigner17快捷键
  3. AcWing 1813. 方块游戏(暴力枚举)
  4. chrome 通过插件来监控zabbix
  5. Exchange+SP2的安装
  6. MT4红绿柱黄白线双线MACD指标
  7. KK音标和国际音标的对照
  8. angular 脏值检测基础流程
  9. 我的世界java版如何装mod_《我的世界》怎么装mod 安装方法教程
  10. 熵权法stata程序
  11. 阿里巴巴国际站 网站和PC客户端都登录不了,其他电脑或手机可以
  12. 微型计算机的alu部件包含在什么中,【单选题】微型计算机的ALU部件包括在( )之中。A. 存储器 B. I/O接口 C. O/I接口 D. CPU...
  13. 伟景行citymaker-----01.javascript打开本地模型CEP,加载目录树,加载要素类
  14. Java集合框架笔记,足够深,足够全面
  15. 【Unity】Unity实现鼠标控制摄像机围绕物体旋转镜头 滑轮控制远近
  16. 学生网课网页设计成品 在线视频学习类网页制作 三层结构网页模板 静态HTML注册登录网页模板 学生毕业设计网页制作作品 网校类网页代制做
  17. 14.刚体组件Rigidbody
  18. android中shape资源定义,Android可绘制对象资源之shape和layer-list使用
  19. 远程命令/代码执行漏洞(RCE)总结
  20. H5IOSAndroid-入坑指南

热门文章

  1. Java tree set_Java TreeSet tailSet()方法
  2. palapaweb怎样开启服务_为什么说微服务,要从前后端分离开始?一文带你揭秘深入微服务...
  3. echarts 卡_图表太丑怎么破,ECharts神器带你飞!
  4. 【APICloud系列|30】UILoading 模块demo源码的实现
  5. js sort方法根据数组中对象的某一个属性值进行排序(实用方法)
  6. vue2.0 element-ui中的el-select选择器无法显示选中的内容
  7. 原型 - 实现自己的jQuery
  8. Python萌新笔记
  9. 010 pandas的DataFrame
  10. 常见的linux命令及其翻译