• 回溯法理解-2


    1.leetcode面试题08.04幂集

    幂集。编写一种方法,返回某集合的所有子集。集合中不包含重复的元素。

    说明:解集不能包含重复的子集。

     解题思路:

    1.构建出符合题目解的n叉树,即可根据树来设定结束回溯的条件,剪枝的条件,已经是否需要辅助数组 

    通过给出的关于解空间的n叉树,可以知道,需要在回溯的时候传递当前遍历在nums中的index,向下延伸的时候只需要找当前index后面的数,而不需要考虑前面的数,(如果在需要考虑前面的数的情况,可以使用一个boolean[] used数组来辅助);同时观察解空间树中从根到任意节点组成的list都是一个可行解;还有可以看出因为后一个数总是从index后面开始遍历来的,所以算是直接剪枝了;(后面所有的关于回溯法的问题都可以根据思路来写)

    回溯法的总结:
    1.根据题目写出解空间树

    2.写出前序优先遍历该树所需要的参数,参数都是根据合何时不需要向下生成孩子节点,即树的边界,以及怎么根据给出的nums数组来遍历这个解空间树

    3.一定要考虑是否可以剪枝,剪枝可以节省大量的时间复杂度

     代码:

    class Solution {
    public List<List<Integer>> subsets(int[] nums) {
            List<List<Integer>> reList = new ArrayList<>();
            if(nums == null || nums.length == 0 )return reList;
            List<Integer> curList = new ArrayList<>();
            int len = nums.length;
            dfs(reList,curList,0,0,nums,len);
            return reList;
        }
    
    
        public void dfs(List<List<Integer>> reList,List<Integer> curList,int depth,int index,int[] nums,int len){
            if(index == len){
                reList.add(new ArrayList<>(curList));
                return;
            }
            reList.add(new ArrayList<>(curList));
            for (int i = index; i < len; i++) {
                curList.add(nums[i]);
                dfs(reList,curList,i+1,i+1,nums,len);
                curList.remove(curList.size() -1);
            }
    
    
        }
    
    }
    

      

    知之为知之,不知为不知
  • 相关阅读:
    继承关系·
    对象第复制operator=
    关于类拷贝造函数
    静态数据成员与静态成员函数
    linux新内核的时钟机制代码
    RTC系统
    Android关机闹钟实现
    更改printk打印级别
    vncserver 配置全屏显示
    vnc里鼠标拖动终端就会产生ctrl+c终端
  • 原文地址:https://www.cnblogs.com/bevishe/p/13062359.html
Copyright © 2020-2023  润新知