给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
解题思路:
组合问题的通解是用DFS,这题比较特殊,选择的对象是1-n的整数,有序,写几层循环就能解决问题。但是本人就是喜欢DFS,最近也在狂练这个算法。
1.确定2个递归参数。当前正在访问的数,当前已选择的数据。
2.递归的方法,只访问比这个数更大的数,避免重复的组合。
3.结束递归的条件有2个,1.选择的数据够了K个。2.可供选择的数据不足K个。
class Solution { public: vector<vector<int>> combine(int n, int k) { if (n <= 0) return res; if (k <= 0) return res; if (k > n) return res; N = n; K = k; vector<int> road; DFS(1,road); return res; } private: void DFS(int pos, vector<int> road) { int size = road.size(); if (K - size > N - pos+1) return; if (size == K) { res.push_back(road); return; } for (int i = pos; i <= N; i++) { road.push_back(i); DFS(i + 1, road); road.pop_back(); } } private: int N, K; vector<vector<int>> res; }; |