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

回溯算法是什么?

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

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

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

适合回溯算法解决的问题

全排列
子集

全排列

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

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
多实战,将数据结构与算法用于工作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值