栈
括号匹配问题
1 | LEFT = {'(','[','{'} |
迷宫问题
最后栈为空说明已经无路可走,如果栈不为空说明找到了一条路径。
为了让表达统一,我们初始化迷宫的时候,将迷宫四周边缘都设成1,这样我们就不用考虑一个点是边界还是非边界点,即所有点都判断上下左右点是否唯一即可。
1 | #初始化迷宫 |
后缀表达式求值
1 | """ |
背包问题
”回溯法“就是一步一步创建解的过程。
1 | """ |
队列
Python中队列的接口为:
Python标准库中的队列deque
队列的方法如下:
二项式系数
1 | """ |
划分无冲突子集
1 | """ |
数字变换(用队列实现广度优先搜索)
1 | """ |
二叉树
创建二叉树
1 | class TreeNode(object): |
遍历二叉树(前、中、后序)(递归、回溯-栈)
1 | class TreeNode(object): |
使用递归的开销比较大,下面实现一个迭代版的先序遍历。
1 | # 回溯的前序遍历 |
遍历二叉树(层次遍历 - 队列)
一个节点出队后,才入队它的子节点。
1 | # 层次遍历 |
二叉树的深度
采用分而治之的思路,把求一个树的深度转化为它左子树的深度加上右子树的深度。
1 | # 求二叉树的深度 -- 递归方式 |
1 | # 求二叉树的深度 -- 非递归方式,层次遍历,只需记录一下当前节点的深度即可 |
拷贝二叉树
依旧采用分治的思想,先拷贝左子树,再拷贝右子树,接着拷贝节点。
1 | def copyTree(node): |
N个节点不同二叉树个数
计算由N个节点,所构成的二叉树的个数。
1 | def count(n): |
二叉搜索树
二叉搜索树又作二叉排序树,它可以支持快速的查找。
1 | # 对于二叉搜索树的操作 |
图
在Python中使用图
邻接矩阵表示法(有向图、无向图):
1 | # 用二维数组表示 |
邻接矩阵的缺点:
1.如果图中节点个数很多,边的条数很少,则会浪费资源。
2.访问一个节点的邻接节点,需要遍历一个列表才可以。
邻接集合表示法(有向图和无向图):
用一个列表存储集合的形式保存节点和边的关系,第一个集合保存节点1,第一个集合保存节点2,以此类推。
1 | """ |
邻接列表就是把集合换成列表。
对于带权的边,可以使用邻接字典。
不再使用集合存储,而使用字典存储,其中字典的值表示边的长度。
1 | G3 = [{b:4,e:2},{c:5,d:6,e:3}] |
图的深度优先遍历算法DFS
1 | G = [ |
图的广度优先遍历算法BFS
1 | G = [ |
最小生成树算法(Prim算法)
图的生成树:包含所有顶点不能有回环的图。
最小生成树:代价(边的权值)最小的生成树。
1 | G = [ |
最短路径算法(Dijkstra算法)
1 | a,b,c,d,e,f = range(6) |
拓扑排序算法
首先寻找入度为0的点。添加到队列中,删除其出度的边,再次寻找入度为0的点,添加到队列中。依此类推。
1 | G = { |
枚举
枚举简介
将可能的解逐一列出。
熄灯问题
动态规划
贪心算法
- 问题求解时,总是做出在当前来看最好的选择。即,不保证全局最优,仅是在某种意义上的局部最优解。
- 自顶向下的计算,将原问题归结为子问题。
f(m,n) = f(m-1,n) + f(m,n-1)