LeetCode/solutions/216. Combination Sum III.md
2019-09-10 20:01:43 +08:00

1.1 KiB

216. Combination Sum III

思路

从1-9十个数字中选出k个数字和为n, 要求返回所有组合.

这种求所有组合的题一般就是DFS, 此题为了避免重复, 我们需要一个start标记, 每次从start开始进行递归DFS调用而不是每次都从1. 另外, 由于有了start标记, 我们也不需要使用visited数组了.

C++

class Solution {
private:
    void DFS(int start, int k, int n, vector<vector<int>>&res, vector<int>&out){
        if(k < 0 || n < 0) return;
        if(k == 0 || n == 0){
            if(n == k) res.push_back(out);
            return;
        }
        // 每次从start开始进行递归调用而不是每次都从1
        for(int i = start; i <= 9; i++){
            out.push_back(i);
            DFS(i + 1, k - 1, n - i, res, out);
            out.pop_back();
        }
    }
    
public:
    vector<vector<int>> combinationSum3(int k, int n) {
        vector<vector<int>>res;
        vector<int>out;
        
        DFS(1, k, n, res, out);
        return res;
    }
};