可以用类似于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 };