Leetcode算法Java全解答–77. 组合
题目
给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
想法
回溯算法: 以1起始数据,然后将2.3.4拼进去;
再回头以2为起始位置,这时候就不能把1算进去,然后把3.4拼进去
结果
超过9%的测试案例
时间复杂度/空间复杂度:n/n
总结
代码
我的答案
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> ans = new ArrayList<>();
List<Integer> cur = new ArrayList<>();
dfs(n, k, 0, cur, ans);
return ans;
}
private void dfs(int n, int k, int last, List<Integer> cur, List<List<Integer>> ans) {
if (k == 0) {
ans.add(new ArrayList<>(cur));
return;
}
for (int i = last + 1; i <= n; i++) {
cur.add(i);
dfs(n, k - 1, i, cur, ans);
cur.remove(i);
}
}
大佬们的答案
public List<List<Integer>> better(int n, int k) {
List<List<Integer>> ret = new ArrayList<List<Integer>>();
if (k > n) {
return ret;
}
List<Integer> list = new ArrayList<Integer>();
getpass(n, k, list, ret, 1);
return ret;
}
public void getpass(int n, int k, List<Integer> list, List<List<Integer>> ret, int start) {
if (list.size() == k) {
ret.add(new ArrayList<Integer>(list));
return;
}
int len = list.size();
for (int i = start; i <= n; i++) {
//加上下面着一个判断语句,速度就提高了很多,嘿嘿
if (n - i < (k - len - 1)) {
return;
}
list.add(i);
getpass(n, k, list, ret, i + 1);
list.remove(list.size() - 1);
}
}
测试用例
@Test
public void test077() {
// 创建测试案例
int n1 = 4;
int k1 = 2;
// 测试案例期望值
List<List<Integer>> expResult1 = new ArrayList<>();
List<Integer> list1 = new ArrayList<>();
list1.add(2);
list1.add(4);
List<Integer> list2 = new ArrayList<>();
list2.add(3);
list2.add(4);
List<Integer> list3 = new ArrayList<>();
list3.add(2);
list3.add(3);
List<Integer> list4 = new ArrayList<>();
list4.add(1);
list4.add(2);
List<Integer> list5 = new ArrayList<>();
list5.add(1);
list5.add(3);
List<Integer> list6 = new ArrayList<>();
list6.add(1);
list6.add(4);
expResult1.add(list1);
expResult1.add(list2);
expResult1.add(list3);
expResult1.add(list4);
expResult1.add(list5);
expResult1.add(list6);
// 执行方法
Solution077 solution077 = new Solution077();
List<List<Integer>> result1 = solution077.combine(n1, k1);
// 判断期望值与实际值
Assert.assertEquals(expResult1, result1);
}
其他
代码托管码云地址:https://gitee.com/lizhaoandroid/LeetCodeAll.git
查看其他内容可以点击专栏或者我的博客哈:https://blog.csdn.net/cmqwan
“大佬们的答案” 标签来自leetcode,侵权请联系我进行删改
如有疑问请联系,联系方式:QQ3060507060