力扣-216-組合總和Ⅲ
阿新 • • 發佈:2022-12-09
仍舊是有一個目標和,但是另一個條件變了
- 從給定的陣列元素中選擇變成了從1-9中固定選擇
- 不限結果陣列元素個數變成了限制k個數字
(看起來有點像組合的加強版)
從1-9中選擇k個數字組合,使得他們的和=n
嗯…那我不是對組合的結果篩一篩既可以了?!
class Solution { public: vector<vector<int>> res; vector<int> temp; vector<vector<int>> combinationSum3(int k, int n) { backTrack(k, n, 1); return res; } void backTrack(int k,int n,int cur) { if (temp.size() == k && accumulate(temp.begin(), temp.end(), 0) == n) { res.push_back(temp); return; } for (int i = cur; i <= 9; i++) { temp.push_back(i); backTrack(k, n, i + 1); temp.pop_back(); } } };
當然直接調函式是最快的,也是思路最清晰的,但是不是效率最高的,因為它計算了所有的組合
所以我們嘗試優化一下,其實就是之前的老辦法
class Solution { public: vector<vector<int>> res; vector<int> temp; vector<vector<int>> combinationSum3(int k, int n) { backTrack(k, n, 1); return res; } void backTrack(int k,int target,int cur) { if (target < 0) return; if (temp.size() == k && target==0) { res.push_back(temp); return; } for (int i = cur; i <= 9; i++) { temp.push_back(i); backTrack(k, target-i, i + 1); temp.pop_back(); } } };