一. 題目描述
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.
Ensure that numbers within the set are sorted in ascending order.
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]]
二. 題目分析
這道題題是組合之和系列的第三道題,跟之前兩道Combination Sum 組合之和,前面兩道題的聯系比較緊密,變化不大,而這道跟它們最顯著的不同就是這道題要求一個解中元素的個數為k。
實際上這道題是Combination Sum和Combination Sum II的綜合體,兩者雜糅到一起就是這道題的解法了。n是k個數字之和,如果n<0,則直接返回,如果n == 0,而且此時臨時組合temp中的數字個數正好為k,說明此時是一個合適的組合解,將其存入結果result中。
三. 示例代碼
#include
#include
using namespace std;
class Solution {
public:
vector > combinationSum3(int k, int n) {
vector > result;
vector temp;
combinationSum3DFS(k, n, 1, temp, result);
return result;
}
private:
void combinationSum3DFS(int k, int n, int level, vector &temp, vector > &result) {
if (n < 0) return;
if (n == 0 && temp.size() == k) result.push_back(temp);
for (int i = level; i <= 9; ++i) {
temp.push_back(i);
combinationSum3DFS(k, n - i, i + 1, temp, result);
temp.pop_back();
}
}
};
四. 小結
Combination Sum系列是經典的DFS題目,還需要深入研究。