已解决
【算法与数据结构】216、LeetCode组合总和 III
来自网友在路上 166866提问 提问时间:2023-11-07 16:29:00阅读次数: 66
最佳答案 问答题库668位专家为你答疑解惑
文章目录
- 一、题目
- 二、解法
- 三、完整代码
所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。
一、题目
二、解法
思路分析:本题可以直接利用77题的代码【算法与数据结构】77、LeetCode组合,稍作修改即可使用。
程序如下:
class Solution {
private:vector<vector<int>> result; // 结果合集vector<int> path;void backtracking(int n, int k, int startIndex) {if (path.size() == k) {if(accumulate(path.begin(), path.end(), 0) == n) result.push_back(path); return;}for (int i = startIndex; i <= n; i++) {path.push_back(i); // 处理节点backtracking(n, k, i + 1); // 递归path.pop_back(); // 回溯,撤销处理的节点}}
public:vector<vector<int>> combine(int n, int k) {backtracking(n, k, 1);return result;}
};
复杂度分析:
- 时间复杂度: O ( n ∗ 2 n ) O(n*2^n) O(n∗2n)。
- 空间复杂度: O ( n ) O(n) O(n)。
考虑到代码的效率,进一步修改代码,做剪枝优化:
class Solution {
private:vector<vector<int>> result; // 结果合集vector<int> path;void backtracking(int n, int k, int sum, int startIndex) {if (sum > n) return; // 剪枝if (path.size() == k) { if(sum == n) result.push_back(path); return;}for (int i = startIndex; i <= 9 -(k - path.size()) + 1; i++) {sum += i;path.push_back(i); // 处理节点backtracking(n, k, sum, i + 1); // 递归sum -= i; // 回溯path.pop_back(); // 回溯,撤销处理的节点}}
public:vector<vector<int>> combinationSum3(int k, int n) {backtracking(n, k, 0, 1);return result;}
};
三、完整代码
# include <iostream>
# include <vector>
using namespace std;class Solution {
private:vector<vector<int>> result; // 结果合集vector<int> path;void backtracking(int n, int k, int sum, int startIndex) {if (sum > n) return; // 剪枝if (path.size() == k) { if(sum == n) result.push_back(path); return;}for (int i = startIndex; i <= 9 -(k - path.size()) + 1; i++) {sum += i;path.push_back(i); // 处理节点backtracking(n, k, sum, i + 1); // 递归sum -= i; // 回溯path.pop_back(); // 回溯,撤销处理的节点}}
public:vector<vector<int>> combinationSum3(int k, int n) {backtracking(n, k, 0, 1);return result;}
};int main() {int n = 7, k = 3;Solution s1;vector<vector<int>> result = s1.combinationSum3(k, n);for (vector<vector<int>>::iterator it = result.begin(); it != result.end(); it++) {for (vector<int>::iterator jt = (*it).begin(); jt != (*it).end(); jt++) {cout << *jt << " ";}cout << endl;}system("pause");return 0;
}
end
查看全文
99%的人还看了
相似问题
- 〖大前端 - 基础入门三大核心之JS篇㊲〗- DOM改变元素节点的css样式、HTML属性
- Java 算法篇-链表的经典算法:判断回文链表、判断环链表与寻找环入口节点(“龟兔赛跑“算法实现)
- 代码随想录二刷 | 链表 | 删除链表的倒数第N个节点
- 节点导纳矩阵
- bhosts 显示节点 “unreach“ 状态
- 电子电器架构 —— 车载网关边缘节点总线转换
- 〖大前端 - 基础入门三大核心之JS篇㊳〗- DOM访问元素节点
- 第四天||24. 两两交换链表中的节点 ● 19.删除链表的倒数第N个节点 ● 面试题 02.07. 链表相交 ● 142.环形链表II
- CS224W5.1——消息传递和节点分类
- Vue报错解决Error in v-on handler: “Error: 无效的节点选择器:#div1“
猜你感兴趣
版权申明
本文"【算法与数据结构】216、LeetCode组合总和 III":http://eshow365.cn/6-34613-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: 2023年AI行业报告(附全文下载)
- 下一篇: 【Java】三种方案实现 Redis 分布式锁