1. 程式人生 > >Leetcode:Combinations 組合

Leetcode:Combinations 組合

Given two integers n and k, return all possible combinations of k numbers out of 1 ... n.

For example,
If n = 4 and k = 2, a solution is:

[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]
分析:看到這個題後第一反應就是用遞迴,遇到這樣的題目可以先從小例子入手,比如n = 4, k = 3。首先將1固定,從2,3,4三個數中找再按相同方法選出2個數,就是再從n-1個數中找k-1個數的組合這裡面就蘊含著遞迴的思想,遞迴結束條件就是當k=0時。這樣找出來的陣列都是以1開頭的,然後再迭代找以2,3開頭的陣列。 在做這道題時知道是用遞迴,但是到底怎麼用糾結了半天,遞迴函式的設計是關鍵。 程式碼如下:
class Solution {
public:
    void combine(int n,int k,int start,vector<int> &vec,vector<vector<int> > &result)
    {
        if(k == 0)
        {
            result.push_back(vec);
            return;
        }
        for(int i = start;i <= n;i++)
        {
            vec.push_back(i);
            combine(n,k - 1,i + 1,vec,result);
            vec.pop_back();
        }
    }
    vector<vector<int> > combine(int n, int k) {
        vector<vector<int> > result;
        if(k < 1 || k > n)return result;
        vector<int> vec;
        combine(n,k,1,vec,result);
        return result;
    }
};
牢騷:又是遞迴思想的應用,只有把思路理順了,才能完整的寫出遞迴函式來。在做遞迴時,可以不用太注重遞迴的細節,就直接假設需要遞迴的子問題以及完成了,只需要關注本輪遞迴就行了,不用想太多,反正子問題的解決方法和原問題的解決方法都是一樣的,將遞迴介面設計好了直接遞迴就行。唉~~~,渣渣啊!我咋還不會呢?@