Leetcode:Combinations 組合
阿新 • • 發佈:2019-01-30
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; } };