LeetCode----077. Combinations----Medium

  2018.3.1  17:06  第一篇博客
 

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],
]
這道題我用的是深度優先搜索(DFS),深度優先搜索的思維與常人的思維方式比較接近,比較容易理解,甚至在某些場合有些像(聰明的)枚舉。
示例有些過於簡單,不妨構造一個稍顯複雜的例子,如取n=6 , k=4的情況:
顯然首先第一組滿足情況的是:
① 1,2,3,4 那麼也不難有規律地寫出第二組,就是1,2,3,4 ,變成
②  1,2,3,5 可以發現有一個刪除最後一位數字的步驟,可以用DFS遞歸操作後進行pop_back()操作
class Solution {
public:
    vector<vector<int>> combine(int n, int k) {
        if(n < k || k == 0) return result;
        dfs(1,0,n,k);
        return result;
    }
private:
    vector<int> solution;
    vector<vector<int>> result;
    void dfs(int start , int num , int n , int k)
    {
        if(num == k)                     
        {
            result.push_back(solution);
            return;
        }
        for(int i = start ; i <= n ; i++)
        {
            solution.push_back(i);
            dfs(++start,num+1,n,k);
            solution.pop_back();
        }
    }
  
};
值得注意的是dfs(++start,num+1,n,k); ++start不能改成start+1,如果改成start+1,在遞歸返回的時候,會發生重複,具體部分情況如下圖所示:

  這裏的[1,2,3,X](X代表比3大的數),遞歸返回到[1,2,4,Y]的時候發生了問題,由於start+1在返回時start不會改變,所以這裏start=3,故再次進入遞歸時候Y依舊從4開始,如果改成++start,返回後的start=4,故再次進入遞歸時候Y會從5開始,從而避免了重複。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章