zoukankan      html  css  js  c++  java
  • Leetcode 78 子集

    又一个回溯法的题目,做完了排列,这个是子集

    区别就是:

    一边track要一边把路径加入结果

    二是要定一个序号,这个序号后面的才是可选的值,这个自己画一个树应该就能感觉出来

    例如第一个选2,后面可选的就只有3

     还有一个问题就是这个题不存在结束条件,写出来也是白写,因为已经在for循环中已经附带了什么时候该结束了

    一开始自己写的代码如下:

    class Solution {
        List<List<Integer>> res=new LinkedList<>();//结果集
        public List<List<Integer>> subsets(int[] nums) {
            List<Integer> track=new LinkedList<>();
            backtracking(0,nums,track);
            return res;
        }
        void backtracking(int startIndex,int[] nums,List<Integer> track)
        {
            if(startIndex==nums.length)
            {
                res.add(new LinkedList<>(track));//一开始这里忘写了
                return;
            }//终止条件,其实不用写
    
            res.add(new LinkedList<>(track));//添加结果
            for(int i=startIndex;i<nums.length;i++)
            {
                track.add(nums[i]);
                backtracking(i+1,nums,track);
                track.remove(track.size()-1);
            }
        }
    }

    修改后应该是:

    class Solution {
        public List<List<Integer>> subsets(int[] nums) {
            List<List<Integer>> res = new ArrayList<>();
            backtrack(0, nums, res, new ArrayList<Integer>());
            return res;
    
        }
    
        private void backtrack(int i, int[] nums, List<List<Integer>> res, ArrayList<Integer> tmp) {
            res.add(new ArrayList<>(tmp));
            for (int j = i; j < nums.length; j++) {
                tmp.add(nums[j]);
                backtrack(j + 1, nums, res, tmp);
                tmp.remove(tmp.size() - 1);
            }
        }
    }
  • 相关阅读:
    mysql 配置
    idea 学会看log文件
    ac自动机(tree+kmp模板)
    矩阵快速幂(纯数学递推)
    矩阵快速幂(queue递推)
    RMQ(连续相同最大值)
    dp(过河问题)
    bfs(火星撞地球)
    相同子序列集合
    图博弈
  • 原文地址:https://www.cnblogs.com/take-it-easy/p/14512681.html
Copyright © 2011-2022 走看看