Leetcode算法Java全解答--77. 组合.md

Posted by lizhao on 07-09,2019

Leetcode算法Java全解答--77. 组合

[toc]

题目

给定两个整数 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