Typical recurrsion\DFS problem. Just take care of memory use.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Solution { public: vector<vector<int>> ret; void go(int currMaxN, int currK, int k, unordered_set<int> set, vector<int> currRet) { if (currK == k) { ret.push_back(currRet); return; } auto it = set.begin(); for (int i : set) { if (i > currMaxN) { vector<int> thisRet = currRet; thisRet.push_back(i); unordered_set<int> thisSet = set; thisSet.erase(i); go(i, currK + 1, k, thisSet, thisRet); } } } vector<vector<int> > combine(int n, int k) { if (k > 0) { unordered_set<int> set; for (int i = 1; i <= n; i++) set.insert(i); for (int i = 1; i <= n - k + 1; i++) { unordered_set<int> currSet = set; currSet.erase(i); vector<int> v; v.push_back(i); go(i, 1, k, currSet, v); } } return ret; } };