组合总和 III
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
说明:
-
所有数字都是正整数。
-
解集不能包含重复的组合。
示例 1:
输入: k = 3, n = 7
输出: [[1,2,4]]
示例 2:
输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
思路:做过前面的组合总数I、II之后,会觉得这道题得心应手。一样的套路,唯一需要变化的是在for循环中的初始值从何开始。
我们用一个start来作为标记。 代码如下:
java版本
class Solution { public List<List<Integer>> combinationSum3(int k, int n) { List<List<Integer>> res=new ArrayList(); List<Integer> temp=new ArrayList(); dfs(res,n,k,0,temp); return res; } void dfs(List<List<Integer>> res,int n,int k,int len ,List<Integer> temp){ if(n<0)return ; //减枝 if(len==k){ if(n==0){ res.add(new ArrayList(temp)); } return; } for(int i=1;i<=9;i++){ if(!temp.contains(i))temp.add(i); dfs(res,n-i,k,len+1,temp); if(temp.contains(i))temp.remove(temp.size()-1); } } }
c++版
class Solution { public: void dfs(int k,int n,vector<vector<int>>& res,vector<int>& temp,int start){ if(k==0){ if(n<0)return; if(n==0){ res.push_back(temp); return; } } for(int i=start;i<10;i++){ temp.push_back(i); dfs(k-1,n-i,res,temp,i+1); temp.pop_back(); } } vector<vector<int>> combinationSum3(int k, int n) { vector<vector<int>> res; vector<int> temp; dfs(k,n,res,temp,1); return res; } };