zoukankan      html  css  js  c++  java
  • leetcode——77.组合

    递归+回溯

    完成!

    public List<List<Integer>> combine(int n, int k) {
            if(k>n){
                return new ArrayList<>();
            }
            List<List<Integer>> res = new ArrayList<>();
            List<Integer> list = new ArrayList<>();
            if(k==n){
                for(int i = 1;i<=n;i++){
                    list.add(i);
                }
                res.add(list);
                return res;
            }
            //接下来是k<n的情况
            //当数组元素个数==k的时候,将其添加进res
            //需要一个递归函数
            //得有一个标记是否被访问过的参数
            boolean[] selected = new boolean[n+1];
            backtrack(n,k,res,list,selected);
            return res;
        }
    
        private void backtrack(int n, int k, List<List<Integer>> res, List<Integer> list,boolean[] selected) {
            if(list.size() == k){
                res.add(new ArrayList<>(list));
                return;
            }
            for(int i = 1;i<=n;i++){
                if(!selected[i] && (list.isEmpty() || i>list.get(list.size()-1))){
                    list.add(i);
                    selected[i] = true;
                    backtrack(n, k, res, list, selected);
                    selected[i] = false;
                    list.remove(list.size() - 1);
                }
            }
        }

     优化之后:

    public List<List<Integer>> combine(int n, int k) {
            List<List<Integer>> res = new ArrayList<>();
            List<Integer> list = new ArrayList<>();
            backtrack(n,k,1,0,res,list);
            return res;
        }
        private void backtrack(int n, int k,int start,int cur, List<List<Integer>> res, List<Integer> list) {
            if(cur == k){
                res.add(new ArrayList<>(list));
                return;
            }
            for(int i = start;i<=n;i++){
                list.add(i);
                backtrack(n, k, i+1,cur+1,res, list);
                list.remove(list.size() - 1);
            }
        }

     ——2020.8.2

    我的前方是万里征途,星辰大海!!
  • 相关阅读:
    Unicode与JavaScript详解 [很好的文章转]
    4种方法生成二维码 (js 控制canvas 画出 二维码)
    JQuery-Dialog(弹出窗口,遮蔽窗口)
    JQuery实现可编辑的表格
    7个提高效率的JavaScript调试工具
    jQuery中的编程范式
    10款CSS3按钮
    jQuery(function(){})与(function(){})(jQuery)的区别
    JQuery之ContextMenu(右键菜单)
    糟糕的css用法 1
  • 原文地址:https://www.cnblogs.com/taoyuxin/p/13418795.html
Copyright © 2011-2022 走看看