• 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);
            }
        }
    }
    
    
  • 相关阅读:
    CodeForces 347B Fixed Points (水题)
    CodeForces 347A Difference Row (水题)
    CodeForces 346A Alice and Bob (数学最大公约数)
    CodeForces 474C Captain Marmot (数学,旋转,暴力)
    CodeForces 474B Worms (水题,二分)
    CodeForces 474A Keyboard (水题)
    压力测试学习(一)
    算法学习(一)五个常用算法概念了解
    C#语言规范
    异常System.Threading.Thread.AbortInternal
  • 原文地址:https://www.cnblogs.com/RealGang/p/14584064.html
Copyright © 2020-2023  润新知