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

leetcode-77-組合

最終 輸出 示例 代碼 font 不能 組合 ++ 依然

題目描述:

給定兩個整數 nk,返回 1 ... n 中所有可能的 k 個數的組合。

示例:

輸入: n = 4, k = 2
輸出:
[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]

要完成的函數:

vector<vector<int>> combine(int n, int k)

說明:

1、這道題給定兩個int型整數n和k,要求在[1,n]的閉區間中找到k個整數的組合(組合也就是不重復的)。

比如n=4,k=2,那麽所有的組合是 [1,2] [1,3] [1 4] [2,3] [2,4] [3,4]。

把每一個組合放在一個一維vector中,所有的組合存儲在二維的vector中,最後返回這個二維的vector。

2、這道題目也是一道遞歸的題目,我們依然用熟悉的方法來做。

代碼如下(附詳解):

    vector<vector<int>>res;//全局變量,最終要返回的二維vector
    vector<int>res1;//全局變量,存儲每一個可能的組合
    void digui(int n,int k,int index)
    {
        if(k==0)//退出條件,當前沒有數要加入了
        {
            res.push_back(res1);
            return;
        }
        for(int i=index;i<=n-k+1;i++)//不斷地循環,註意i的範圍,比如n=4,k=2的時候,i最大也只能取3,不能取4
        {
            res1.push_back(i);
            digui(n,k-1,i+1);//k減1,少了一個要添加的數,i加1,從下一個坐標開始
            res1.pop_back();
        }
    }
    vector<vector<int>> combine(int n, int k) 
    {
        digui(n,k,1);//直接進入遞歸函數,k表示當前還有幾個數要加入,1表示當前要從1開始
        return res;//返回最終的二維vector
    }

上述代碼實測56ms,beats 99.55% of cpp submissions。

leetcode-77-組合