题目:Combination Sum III
原题链接:https://leetcode.com/problems/combination-sum-iii/
Find all possible combinations of k numbers that add up to a number n, given that only numbers from 1 to 9 can be used and each combination should be a unique set of numbers.
Example 1:
Input: k = 3, n = 7
Output:
[[1,2,4]]
Example 2:
Input: k = 3, n = 9
Output:
[[1,2,6], [1,3,5], [2,3,4]]
从 1 到 9 中选择 k 个数字,使它们的和等于 n ,要求数字不能重复。
用深度遍历可以解决,由于要求数字不能重复,我们可以按照从小到大的顺序来依次选取。用 index 来记录当前选取的数字,用 cnt 来记录当前已经选择的数字的个数, 用 sum 来记录当前所选取的数字和。每次选取数字之后把它压入数组, 然后一次选择他后面的数字来压入数组递归,记得递归结束之后要把当前压入的数字给删除。
代码如下:
class Solution {
public:
void DFS(vector<int>& temp, int index, int sum, int n, int cnt, int k, vector<vector<int> >& ans) {
if(index > 9 || sum >= n || cnt > k) {
if (sum == n && cnt == k) ans.push_back(temp);
return;
}
for (int i = index + 1; i <= 9; ++i) {
temp.push_back(i);
DFS(temp, i, sum + i, n, cnt + 1, k, ans);
temp.pop_back(); // 记得把数字给删除
}
}
vector<vector<int>> combinationSum3(int k, int n) {
vector<vector<int> > ans;
vector<int> temp;
DFS(temp, 0, 0, n, 0, k, ans);
return ans;
}
};