1. 程式人生 > >Leetcode演算法Java全解答--77. 組合

Leetcode演算法Java全解答--77. 組合

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