主页 > 互联网  > 

leetcode第216题组合总和Ⅲ

leetcode第216题组合总和Ⅲ

原题出于leetcode第216题 leetcode /problems/combination-sum-iii/description/题目为:

找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:

只使用数字1到9

每个数字 最多使用一次

返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回

1.树型结构

2.代码 class Solution { public: vector<vector<int>> result; vector<int> path; void backtracking(int k,int n,int sum,int startindex){ if(path.size()==k){ if(n==sum){ result.push_back(path); } return ; } for(int i=startindex;i<=9;i++) { sum+=i; path.push_back(i); backtracking(k,n,sum,i+1); sum-=i; path.pop_back(); } } vector<vector<int>> combinationSum3(int k, int n) { path.clear(); result.clear(); backtracking(k,n,0,1); return result; } }; 3.剪枝操作

此处有两处可做剪枝,先看如下树形结构:

如果当前n的值已经比sum大了,后续就不需要遍历了

因此可加如下代码来判断:

if(n>sum){ return ; }

这里仍然有组合个数限制为k,与组合问题类似,可调节i的范围

具体代码如下:

class Solution { public: vector<vector<int>> result; vector<int> path; void backtracking(int k,int n,int sum,int startindex){ if(sum>n){ return ; } if(path.size()==k){ if(n==sum){ result.push_back(path); } return ; } for(int i=startindex;i<=9-(k-path.size())+1;i++) { sum+=i; path.push_back(i); backtracking(k,n,sum,i+1); sum-=i; path.pop_back(); } } vector<vector<int>> combinationSum3(int k, int n) { path.clear(); result.clear(); backtracking(k,n,0,1); return result; } };

标签:

leetcode第216题组合总和Ⅲ由讯客互联互联网栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“leetcode第216题组合总和Ⅲ