【1】【leetcode-77】 组合
(典型,做过似曾相识但不熟悉,基本知道怎么做但调试了一个多小时各种错)
给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
我的:
public class Solution77 { ArrayList<ArrayList<Integer>> res = new ArrayList<>(); //为了不重复,list中只能是顺序 public ArrayList<ArrayList<Integer>> combine(int n, int k) { if (k > n || k<0 || n<0) { return res; } ArrayList<Integer> list = new ArrayList<>(); helper(n,k,1,list); return res; } // 还能加入k个数 public void helper(int n, int k,int start,ArrayList<Integer> list) { if (k == 0) { res.add(new ArrayList<>(list)); // 易错点1 return; } for (int i=start;i<=n-k+1;i++) { list.add(i); helper(n,k-1,i+1,list); list.remove(list.size()-1); // 易错点2 } } }
参考:
链接:https://www.nowcoder.com/questionTerminal/4d0a110416d84c7f9454d0da53ab2da1 来源:牛客网 import java.util.ArrayList; //使用剪枝对算法进行了优化; //Your runtime beats 99.50 % of java submissions public class Solution { private ArrayList<ArrayList<Integer>> res; public ArrayList<ArrayList<Integer>> combine(int n, int k) { res = new ArrayList<ArrayList<Integer>>(); if (n <= 0 || k <= 0 || n < k) return res; generateCombinations(n, k, 1, new ArrayList<Integer>()); return res; } private void generateCombinations(int n, int k, int start, List<Integer> list) { if (list.size() == k) { res.add(new ArrayList<Integer>(list)); return; } if (start > n) return; int len = k - (list.size() + 1); //list当中最终应该有k个元素,当前元素为list.size() + 1,那么我们要为下次回溯留下足够多的数 for (int i = start; i <= n - len; i++) { list.add(i); generateCombinations(n, k, i + 1, list); list.remove(list.size() - 1); } } }