Leetcode演算法Java全解答--77. 組合
阿新 • • 發佈:2018-12-26
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