LeetCode--Combinations(动态规划与深度优先搜索)
来源:互联网 发布:诺基亚230软件下载 编辑:程序博客网 时间:2024/06/05 09:14
Combinations
Given two integers n and k, return all possible combinations of k numbers out of 1 ... n.
For example,
If n = 4 and k = 2, a solution is:
[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4],]
及从1到n中选出k个数,得到所有的结果。题目中没有刻意强调升序。
开始想到的是动态规划,后一个数依赖前面的数字。具体实现如下。
public class Solution { public List<List<Integer>> combine(int n, int k) { if (k > n) return null; else { List<List<Integer>> result = new ArrayList<List<Integer>>(); List<List<Integer>> resultSwitch = new ArrayList<List<Integer>>(); for (int i1 = 0; i1 < k; i1++) { if (i1 == 0) { for (int i2 = 1; i2 <= n - k + 1; i2++) { List<Integer> temp = new ArrayList<Integer>(); temp.add(i2); result.add(temp); } } else { while (result.size() != 0) { List<Integer> temp = result.get(0); for (int i = temp.get(temp.size() - 1) + 1; i <= n - k + temp.size() + 1; i++) { List<Integer> tempClone = this.clone(temp); tempClone.add(i); resultSwitch.add(tempClone); } result.remove(0); } List<List<Integer>> temp = result; result = resultSwitch; resultSwitch = temp; } } return result; } } private List<Integer> clone(List<Integer> source) { List<Integer> result = new ArrayList<Integer>(); for (int i = 0; i < source.size(); i++) { result.add(source.get(i)); } return result; }}
后来在网上看到dfs深度优先搜寻,代码更简洁。
public class Solution { public List<List<Integer>> combine(int n, int k) { if (k > n) return null; else { List<List<Integer>> result = new ArrayList<List<Integer>>(); List<Integer> rs = new ArrayList<Integer>(); this.dfs(n, k, rs, result); return result; } } private void dfs(int n, int k, List<Integer> rs, List<List<Integer>> result) { if (k == 0) { result.add(rs); return; } else { for (int i = rs.size() == 0 ? 1 : rs.get(rs.size() - 1) + 1; i <= n - k + 1; i++) { List<Integer> tempList = this.clone(rs); tempList.add(i); this.dfs(n, k - 1, tempList, result); } } } private List<Integer> clone(List<Integer> source) { List<Integer> result = new ArrayList<Integer>(); for (int i = 0; i < source.size(); i++) { result.add(source.get(i)); } return result; }}
0 0
- LeetCode--Combinations(动态规划与深度优先搜索)
- 动态规划学习(4,深度优先搜索)
- leetcode 140. Word Break II 动态规划DP + DFS深度优先搜索
- 代码与算法集锦-归并排序+树状数组+快排+深度优先搜索+01背包(动态规划)
- HDU1011Starship Troopers(DP+DFS)深度优先搜索+动态规划
- 深度优先搜索与广度优先搜索
- 深度优先搜索与广度优先搜索
- 广度优先搜索与深度优先搜索
- 深度优先搜索与广度优先搜索
- 广度优先搜索与深度优先搜索
- 深度优先搜索与广度优先搜索
- 深度优先搜索与广度优先搜索
- 深度优先搜索与宽度优先搜索
- 深度优先搜索与广度优先搜索 .
- 深度优先搜索与广度优先搜索
- 深度优先搜索与广度优先搜索
- 深度优先搜索与广度优先搜索
- 深度优先搜索与广度优先搜索
- iOS的三维透视投影
- 机房收费系统之上下机
- 结构方程模型(SEM)的假设(2)
- 数据分组与聚合函数
- ERROR 1201 (HY000): Could not initialize master info structure; more error messages can be found in
- LeetCode--Combinations(动态规划与深度优先搜索)
- 【1864】最大报销额 (HDU)
- [java多线程]创建线程的两个方法
- 结构方程模型(SEM)概述(1)
- IOS 3D UI --- CALayer的transform扩展
- poj 2104 K-th Number(划分线段树)
- 【HDU 4348】To the moon【可持久化线段树】
- 【2775】小P的故事——神奇的饭卡 (sdut)
- 宣传vsdfsdg收到了几十块很快就