1. 程式人生 > >Leetcode ---- 77. 組合

Leetcode ---- 77. 組合

題目:

給定兩個整數 nk,返回 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();
        }
    }
    
};