LeetCode OJ - Combination Sum 再分析
来源:互联网 发布:堆排序java 编辑:程序博客网 时间:2024/05/22 09:02
LeetCode OJ - Combination Sum
一直没能具体体会回溯的好处,对于Combination Sum问题,可以用回溯也可以不用,但是感觉用回溯效率应该更高。
非回溯: 下面的非回溯代码是可以通过的,但是参数item是直接复制传值的,这样程序栈就要浪费很多的空间,当item数目多的时候尤其明显。
void DFS(vector<int> &candidates, int level, vector<int> item, int target) { if(target < 0) { return; } else if(target == 0) { ret.push_back(item); return ; } eles { if(level == candidates.size()) return; for(int i = 0; i <= target / candidates[level]; i++) { if(i != 0)item.push_back(candidates[level]); DFS(candidates, level + 1, item, target - i * candidates[level]); } } }
回溯:下面的回溯代码在上一篇文章中写了是可以通过,如果参数用vector<int> &item那么很显然必须使用回溯,才能得到每一次的正确路径。非回溯到回溯的考虑或许可以从参数开始考虑起,递归设计时,考虑a的取值顺序可以是3 、 2 、 1 、 0。
void DFS(vector<int> &candidates, int level, vector<int> &item, int target) { if(target < 0) { return; } else if(target == 0) { ret.push_back(item); return ; } else { if(level == candidates.size()) return; for(int i = target / candidates[level]; i >= 0; i--) { item.push_back(candidates[level]); } for(int i = target / candidates[level]; i >= 0; i--) { item.pop_back(); DFS(candidates, level + 1, item, target - i * candidates[level]); } } }
下面来看一下递归树中的调用顺序:
注:item又会被赋值{6}
上面的分析似乎不全面,也可以使用下面的回溯:
void DFS(vector<int> &candidates, int level, vector<int> &item, int target) { if(target < 0) { return; } else if(target == 0) { ret.push_back(item); return ; } else { if(level == candidates.size()) return; for(int i = 0; i <= target / candidates[level]; i++) { if(i != 0)item.push_back(candidates[level]); DFS(candidates, level + 1, item, target - i * candidates[level]); } for(int i = 0; i < target / candidates[level]; i++) { item.pop_back(); } } }
0 0
- LeetCode OJ - Combination Sum 再分析
- LeetCode OJ:Combination Sum
- LeetCode OJ - Combination Sum
- LeetCode OJ Combination Sum
- LeetCode OJ:Combination Sum II
- LeetCode OJ - Combination Sum II
- LeetCode OJ Combination Sum II
- LeetCode OJ-39-Combination Sum
- [LeetCode OJ]216. Combination Sum III
- LeetCode OJ-40-Combination Sum II
- [LeetCode OJ]Combination Sum I && II
- LeetCode OJ算法题(三十八):Combination Sum
- LeetCode OJ算法题(三十九):Combination Sum II
- LeetCode OJ 之 Combination Sum (“连接”和)
- LeetCode OJ 之 Combination Sum II (“连接”和 - 二)
- <LeetCode OJ> 39 / 40 / 216 Combination Sum(I / II / III)
- [LeetCode] Combination Sum、Combination Sum II
- 【LeetCode】Combination Sum && Combination Sum II
- NativeCodeLoader: Unable to load native-hadoop library for your platform
- Java实现定时调度的三种方法
- dom的事件传递过程-webkit
- java基础巩固系列(六):java中equals()方法与==的比较
- 获取 无线速率300M get bitrate
- LeetCode OJ - Combination Sum 再分析
- ArrayList和linkedlist之间的转换
- Linux Vim 环境搭建
- 静态代理
- [小技巧] 如何在SHELL里快速启动编辑器
- Dynamics crm2013 IFD部署后启用多组织
- ZOJ Monthly - 135 A + G
- 2450自动升级
- Android系统开发(6)——Linux底层输入输出