• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
ying_vincent
博客园    首页    新随笔    联系   管理    订阅  订阅

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#

 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 }
View Code

 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 }

 

posted @ 2013-03-19 13:50  ying_vincent  阅读(129)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3