Leetcode ---- 77. 組合
阿新 • • 發佈:2018-11-29
題目:
給定兩個整數 n 和 k,返回 1 ... n 中所有可能的 k 個數的組合。
示例:
輸入: n = 4, k = 2 輸出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
思路:
看到該題的第一個反應就是用 n 個 for 迴圈,得到所有包含 k 個數的解,再去重。
然而時間複雜度太高,我們需要採用相對簡潔的程式碼,即回溯。
用 dfs 則需要將問題拆分簡化。我們可以想到,該問題籠統來說就是從1作為起始點,逐個將後面的數字推入棧中,知道棧中的數字量滿足條件(邊界條件),則輸出。
那麼,我們就有了思路了:首先將第一個數字推入棧中,然後遞迴繼續找後一個數字,直到滿足邊界條件。通過回溯得到所有的組合。
程式:
class Solution { public: vector<vector<int>> combine(int n, int k) { vector<int> tmpv; vector<vector<int>> res; dfs(n,k,1,tmpv,res); return res; } void dfs(int n, int k,int i, vector<int> &tmpv, vector<vector<int>> &res){ if (tmpv.size() == k){ res.emplace_back(tmpv); return; } for (int j=i;j<=n;j++){ tmpv.emplace_back(j); dfs(n,k,j+1,tmpv,res); tmpv.pop_back(); } } };