LC77 Combinations

可以用类似于DFS的方法去做。这道题目是LC78 Subsets的子问题。

对于LC78,另一个巧妙的做法是:我们可以先用一个整形数组(长度和nums相等),数组元素一开始都是1。把整个数组看成一个二进制数,然后模拟二进制减法,将这个数组一步一步减1减到0。每减一次1,对照这个二进制数组和nums数组,如果某个位置上二进制数组元素为1,则将nums数组相应位置上的数输出。这样就能输出所有的子集。

这里附上LC77的代码。

 1 class Solution {
 2 private:
 3     vector<vector<int> > ret;
 4     vector<int> a;
 5 public:
 6     void solve(int dep, int maxDep, int n, int start)
 7     {
 8         if (dep == maxDep)
 9         {
10             ret.push_back(a);
11             return;
12         }
13         int last=n+1-(maxDep-dep);
14         for(int i = start; i <= last ; i++)
15         {
16             a[dep] = i;
17             solve(dep + 1, maxDep, n, i + 1);
18         }      
19     }
20     
21     vector<vector<int> > combine(int n, int k) {
22         a.resize(k);
23         ret.clear();
24         solve(0, k, n, 1);
25         return ret;
26     }
27 };
View Code

 

posted @ 2016-04-03 15:53  vaevaevae  阅读(181)  评论(0编辑  收藏  举报