zoukankan      html  css  js  c++  java
  • LeetCode-回溯算法篇

    思路:

    解决一个回溯问题,实际上就是一个决策树的遍历过程。你只需要思考 3 个问题:
    1、路径:也就是已经做出的选择。
    2、选择列表:也就是你当前可以做的选择。
    3、结束条件:也就是到达决策树底层,无法再做选择的条件。

    回溯算法的框架:
    result = []
    def backtrack(路径, 选择列表):
        if 满足结束条件:
            result.add(路径)
            return
    
        for 选择 in 选择列表:
            做选择
            backtrack(路径, 选择列表)
            撤销选择
    

    其核心就是 for 循环里面的递归,在递归调用之前「做选择」,在递归调用之后「撤销选择」

    全排列问题

    题目描述
    给定一个 没有重复 数字的序列,返回其所有可能的全排列。

    代码题解:
    class Solution {
        List<List<Integer>> res = new LinkedList<>();
        public List<List<Integer>> permute(int[] nums) {
            LinkedList<Integer> track = new LinkedList<Integer>();
            backTrack(nums,track);
            return res;
        }
        
    // 路径:记录在 track 中
    // 选择列表:nums 中不存在于 track 的那些元素
    // 结束条件:nums 中的元素全都在 track 中出现
        void backTrack(int[] nums,LinkedList<Integer> track) {
            // 结束条件
            if(track.size() == nums.length) {
                res.add(new LinkedList(track));
                return;
            }
            for(int i=0;i<nums.length;i++) {
                //遍历选择条件列表
                if(track.contains(nums[i])) {
                    continue;
                }
                // 做选择
                track.add(nums[i]);
                // 进入下一层决策树
                backTrack(nums,track);
                // 撤销选择
                track.remove(track.size() -1);
            }
        }
    }
    
    
  • 相关阅读:
    无熟人难办事?—迪米特法则
    考题抄错会做也白搭—模板方法模式
    简历复印—原型模式
    Android Studio 安装及常见问题
    雷锋依然在人间——工厂方法模式
    欢迎测试
    客户端程序设计V1
    Linux服务器端程序设计V1
    【Alpha】最后一篇
    【Alpha】开发日志Day10-0721
  • 原文地址:https://www.cnblogs.com/RealGang/p/14584064.html
Copyright © 2011-2022 走看看