(十五)算法设计思想之“回溯算法”

116 阅读2分钟

@TOC

回溯算法是什么?

回溯算法是算法设计中的一种方法 回溯算法是一种渐进式寻找并构建问题解决方式的策略 回溯算法会先从一个可能的动作开始解决问题,如果不行,就回溯并选择另一个动作,直到问题解决 有点类似鬼吹灯之寻龙诀,探险会碰到很多路,只能一条条试,不通就返回选择另一条路

什么问题适合用回溯算法解决?

有很多路 这些路里,有死路,也有出路 通常需要递归来模拟所有的路

适合回溯算法解决的问题

全排列 子集

全排列

用递归模拟出所有情况 遇到包含重复元素的情况,就回溯 收集所有到达递归终点的情况,并返回 在这里插入图片描述

LeetCode:46.全排列

在这里插入图片描述 解题思路 要求:1、所有排列情况;2、没有重复元素 有出路、有死路 考虑使用回溯算法 解题步骤 用递归模拟出所有情况 遇到包含重复元素的情况,就回溯 收集所有到达递归终点的情况,并返回 在这里插入图片描述 时间复杂度:O(n!),n!=123*......*(n-1)*n 空间复杂度:O(n)

LeetCode:78.子集

在这里插入图片描述 解题思路 要求:1、所有子集;2、没有重复元素 有出路、有死路 考虑使用回溯算法 解题步骤 用递归模拟出所有情况 保证接的数字都是后面的数字 收集所有到达递归终点的情况,并返回 在这里插入图片描述 时间复杂度:O(2^N),因为每个元素都有两种可能(存在或不存在) 空间复杂度:O(N)

思考题

1、说出回溯算法的套路步骤。 2、用回溯算法的套路步骤,描述走迷宫的过程,无需Coding。

回顾

数据结构:栈、队列、链表、集合、字典、树、图、堆 算法:链表/树/图的遍历、数组的排序和搜索...... 算法设计思想:分而治之、动态规划、贪心。回溯 重点难点 数据结构:所有数据结构都很重要,跟前端最相关的是链表和树 算法:链表/树/图的遍历、数组的排序和搜索...... 设计思想:分而治之、动态规划较常考,贪心、回溯次之 经验心得 搞清楚数据结构与算法的特点和应用场景 用JS实现一遍,最好能用第二第三语言再实现一遍 学会分析时间/空间复杂度 提炼前端和算法的结合点,用于工作实战 拓展建议 多刷题,最好能保证300道以上 多总结各种套路、模板 多阅读源码,比如React、Lodash、V8 多实战,将数据结构与算法用于工作