• leetcode 46. 全排列


    最为典型的回溯法题目

    回溯法其实都可以画树形图(决策树),用于解决排列组合问题,n皇后问题等等

     注意这里的路径和选择列表

    关注几点:

    1. 结束递归的条件
    2. 递归前的操作:加入路径
    3. 递归后的操作:撤销选择,等于是回到父节点

    核心框架:

    至于这道题的代码:

    class Solution {
        List<List<Integer>> res=new ArrayList<>();//结果
        public List<List<Integer>> permute(int[] nums) {
            List<Integer> track=new ArrayList<>();//路径,忘记加括号可还行,声明加了public是错的
            backtracking(nums,track);
            return res;
        }
        public void backtracking(int[] nums,List<Integer> track)
        {
            //终止条件
            if(track.size()==nums.length)
            {
                //res.add(track);这里注意
                res.add(new ArrayList(track));
                return;
            }
            //做出选择
            for(int i=0;i<nums.length;i++)
            {
                if(track.contains(nums[i]))
                {
                    continue;//相当于进入路径后,去除备选
                }
                track.add(nums[i]);//加入路径
                backtracking(nums,track);
                track.remove(track.size()-1);
            }
        }
    }

    有几个点注意:

    1. 竟然还写错集合的new过程,手有点生了,乱加public可还行,
    2. 这里没有采取 加入路径-删除选择列表 这种搞法   而是在选择中加入判断,相当于进入路径后,去除备选
    3. 添加结果时要 new ArrayList(track),否则是弱引用
    4. 可以通过所谓交换等方式节省contains判断的时间
  • 相关阅读:
    前端性能优化(2.1 代码分离——入口起点 entry point)
    前端性能优化(prefetch, preload, dns-prefetch, defer, async)
    Golang-函数
    Golang复合类型-map
    Golang复合类型-切片
    Golang复合类型-数组
    Golang基础语法-goto语句
    Golang基础语法-跳出循环
    vueRouter学习笔记
    通过ES6实现个模板操作
  • 原文地址:https://www.cnblogs.com/take-it-easy/p/14476043.html
Copyright © 2020-2023  润新知