LeetCode--Combinations(动态规划与深度优先搜索)
2014-08-23 20:08
274 查看
Combinations
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; } }
相关文章推荐
- Leetcode: Letter Combinations of a Phone Number
- Leetcode 746. Min Cost Climbing Stairs 最小成本爬楼梯 (动态规划)
- LeetCode-17-Letter-Combinations-of-a-Phone-Number 递归+模拟
- leetcode 55 动态规划练习
- [LeetCode] Combinations [38]
- [Java]LeetCode17 Letter Combinations of a Phone Number
- LeetCode--Best Time to Buy and Sell Stock (贪心策略 or 动态规划)
- [leetcode-17]Letter Combinations of a Phone Number(java)
- LeetCode Letter Combinations of a Phone Number
- [LeetCode] 042: Letter Combinations of a Phone Number
- Leetcode 17 Letter Combinations of a Phone Number
- Leetcode 91. Decode Ways 解码方法(动态规划,字符串处理)
- LeetCode——Letter Combinations of a Phone Number
- [leetcode]Combinations
- 动态规划简述-leetcode dynampic programming
- [LeetCode] Combinations 回溯
- LeetCode 474. Ones and Zeroes(动态规划)
- leetcode -- 338. Counting Bits 【动态规划】
- 用深度优先搜索(DFS)(回溯法)解决N皇后问题(Leetcode 51)
- 【leetcode】17. Letter Combinations of a Phone Number