• 【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);
            }
        }
     
    }
  • 相关阅读:
    iOS刨根问底-深入理解RunLoop
    深入理解RunLoop
    Core Graphics框架 利用Quartz 2D绘图
    经济
    次贷危机的原因
    次级抵押贷款
    信用评级
    信用
    理解UIView的绘制-孙亚洲
    二级域名
  • 原文地址:https://www.cnblogs.com/twoheads/p/10639156.html
Copyright © 2020-2023  润新知