【1】【leetcode-77】 组合

(典型,做过似曾相识但不熟悉,基本知道怎么做但调试了一个多小时各种错)

给定两个整数 n 和 k,返回 1 ... 中所有可能的 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);
        }
    }
 
}
原文地址:https://www.cnblogs.com/twoheads/p/10639156.html