本文主要是介绍LeetCode216:组合总和Ⅲ,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述
找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:
只使用数字1到9
每个数字 最多使用一次
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
解题思想
使用回溯算法
代码
class Solution {
public:vector<vector<int>> res;vector<int> path;int sum = 0;void backTracking(int n,int k,int startIndex) {if (path.size() == k && sum == n) {res.push_back(path);return;}for (int i = startIndex; i <= 9; i++) {sum += i;path.push_back(i);//往下走 i+1backTracking(n, k, i+1);//回溯path.pop_back();sum -= i;}}vector<vector<int>> combinationSum3(int k, int n) {backTracking(n, k, 1);return res;}
};
使用剪枝优化
class Solution {
public:vector<vector<int>> res;vector<int> path;int sum = 0;void backTracking(int n, int k, int startIndex) {//优化:在深度上进行剪枝操作if (sum > n) return;if (path.size() == k && sum == n) {res.push_back(path);return;}//优化:在宽度上进行剪枝操作 9-(k-path.size())+1for (int i = startIndex; i <= 9-(k-path.size())+1; i++) {sum += i;path.push_back(i);//往下走 i+1backTracking(n, k, i + 1);//回溯path.pop_back();sum -= i;}}vector<vector<int>> combinationSum3(int k, int n) {backTracking(n, k, 1);return res;}
};
这篇关于LeetCode216:组合总和Ⅲ的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!