LeetCode: Combinations
初始系数没弄好,改了一次
1 class Solution { 2 public: 3 void dfs(vector<vector<int>> &ret, int n, int k, int cur, int dep, vector<int> &tmp) { 4 if (dep == k) { 5 ret.push_back(tmp); 6 return; 7 } 8 for (int i = cur; i <= n; i++) { 9 tmp.push_back(i); 10 dfs(ret, n, k, i+1, dep+1, tmp); 11 tmp.pop_back(); 12 } 13 } 14 vector<vector<int> > combine(int n, int k) { 15 // Start typing your C/C++ solution below 16 // DO NOT write int main() function 17 vector<vector<int>> ret; 18 vector<int> tmp; 19 if (!k || !n || k > n) return ret; 20 dfs(ret, n, k, 1, 0, tmp); 21 return ret; 22 } 23 };
加一个iterative的方法
1 class Solution { 2 public: 3 vector<vector<int> > combine(int n, int k) { 4 // IMPORTANT: Please reset any member data you declared, as 5 // the same Solution instance will be reused for each test case. 6 vector<vector<int> > res; 7 if (k == 0) return res; 8 queue<vector<int> > S; 9 for (int i = 1; i <= n; i++) S.push(vector<int>(1, i)); 10 while (!S.empty()) { 11 vector<int> tmp = S.front(); 12 S.pop(); 13 if (tmp.size() == k) res.push_back(tmp); 14 else { 15 for (int i = tmp.back()+1; i <= n; i++) { 16 vector<int> tmp1 = tmp; 17 tmp1.push_back(i); 18 S.push(tmp1); 19 } 20 } 21 } 22 return res; 23 } 24 };
C#
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class Solution { 2 public List<List<int>> Combine(int n, int k) { 3 List<List<int>> ans = new List<List<int>>(); 4 if (k == 0) return ans; 5 Queue<List<int>> S = new Queue<List<int>>(); 6 for (int i = 1; i <= n; i++) S.Enqueue(new List<int>{i}); 7 while (S.Count != 0) { 8 List<int> tmp = S.Peek(); 9 S.Dequeue(); 10 if (tmp.Count == k) ans.Add(tmp); 11 else { 12 for (int i = tmp[tmp.Count-1]+1; i <= n; i++) { 13 List<int> newTmp = new List<int>(); 14 for (int j = 0; j < tmp.Count; j++) newTmp.Add(tmp[j]); 15 newTmp.Add(i); 16 S.Enqueue(newTmp); 17 } 18 } 19 } 20 return ans; 21 } 22 }
Java
注意clone对于基础数据类型和泛型类型来说就是deep copy,对于对象来说,对象里的基础数据类型是deep copy,而泛型类型则不是,需要override clone()。这题因为直接对List<Integer>进行clone,因此不需要override
1 public class Solution { 2 private List<List<Integer>> ans; 3 public List<List<Integer>> combine(int n, int k) { 4 ans = new LinkedList<List<Integer>>(); 5 LinkedList<Integer> tmp = new LinkedList<Integer>(); 6 dfs(n, k, 1, 0, tmp); 7 return ans; 8 } 9 private void dfs(int n, int k, int cur, int dep, LinkedList<Integer> tmp) 10 { 11 if (dep == k) 12 { 13 ans.add((List<Integer>)tmp.clone()); 14 return; 15 } 16 for (int i = cur; i <= n; i++) 17 { 18 tmp.add(new Integer(i)); 19 dfs(n, k, i+1, dep+1, tmp); 20 tmp.removeLast(); 21 } 22 } 23 }