二叉树递归套路
题目
分析
求以x为头节点树的最大距离
- 最大距离与x无关(最大距离不经过x)
2. 最大距离与x有关(经过x)左树高度+1+右树
要求左右子树返回的信息
- 整棵树的最大距离
- 高度
代码
题目
分析(列可能性)
大分类:x有关与x无关
要求左右子树返回的信息
对于左树:
- 最大子搜索树的size
- 整个树是不是搜索树
- 左树的最大值
对于右数:
- 最大子搜索树的size
- 整个树是不是搜索树
- 右数 的最大值
对左右返回的信息求全集
- 最大子搜索树的size
- 整个树是不是搜索树
- 最大值
- 最小值
代码
题目(多叉树)
分析(列可能性)
大分类:x不来,x来
- x来
2. x不来
代码 o(n)每个节点只过一遍
打表技巧和矩阵处理技巧
打表
不属于预处理结构,打表出的表独立于程序之外。
重点:应用范围
题目
给定一个数组,如何早到他的质数种类
- 思路一:遍历数组,然后编写求质数的函数,然后一个个求解
- 思路二:因为数值里的数大小有限,不超过1000,所以先建立一个1-1000数的质数种类表,到时候遍历数组,直接查表。
题目
背后有数学规律
方法1:
方法2:
题目
题目
(num &(num-1))==0 是2的某次方
2的某次方用二进制标识只有一个1
题目
一堆开关,两个人,分为先手和后手,选择波动一个开关,使得后边(包括自己)的开关全部反转,谁先使所有开关变为开谁赢。
矩阵处理技巧
矩阵特殊轨迹问题
思想:先确定矩阵4个角的坐标 进行宏观调度
如何打印
转圈打印
原地旋转正方形矩阵
分圈结构:外边的数在外边,里边的数在里边
并查集结果和图相关算法
贪心
堆和排序的贪心的常用技巧
题目
暴力方法
贪心方法
找结束时间最早的
题目
暴力算法
给每个位置设置放灯和不放灯两个选项,枚举出所有点,筛选出不能全部照亮的,然后再找出灯最少的。
light要恢复现场,因为一直都使用的一个light
贪心算法
题目
暴力枚举
贪心
先建小根堆,然后弹出堆中前两个数加和,然后放回,最后加和为一个数
题目
类似于找在自己能力范围下,找利润最大的做,赚到钱以后,扩大自己的能力范围,在找利润最大的做。
并查集 解决连通性
设计方法
isSameSet(V x,V y)
union()
代码
代码优化
优化findfather 因为并查集时间复杂度和findfather直接相关
调用足够频繁 单次调用o(1)
题目
代码
p12 暴力递归&图算法
图的表示
邻接表法
从各点出发可以直接到达的邻居
邻接矩阵法
其他表示方法
实际使用方法 模板
不管题目是什么结构表示图,先将题目的结构转化为自己熟悉的结构
转化方法 将其他表示法转化为模板表示法
图的遍历
宽度
深度
拓扑排序
最小生成数
代码 k算法 克鲁斯卡尔算法(并查集思想)
p算法 普利姆算法 不需要并查集 只需要set即可
dijkstra
代码
代码(版本二) 使用小根堆比遍历时间复杂度低
主流程
自己写堆
暴力递归
汉诺塔
三个杆 上边套盘子,盘子需要小压大
问题 如果n个盘子在左杆 如何把盘子放入右杆
大方向
- 1-n-1个盘子 从左到中
- 第n个盘子 从左到右
- 1-n-1 从中到右
n层汉诺塔 移动2^n-1步
题目
题目
打印一个字符串的全部子序列
题目
打印一个字符串的全部子序列(子序列中有重复字符),要求不出现重复字面值的子序列。
题目 打印一个字符串的全部排列
打印一个字符串的全部排序,要求不出现重复的排列
方法一 利用hashset的属性(暴力递归加过滤)
方法二 分支限界 (暴力递归 但对应一些不符合条件的支路直接杀死)
字符串转换题目
注意只需要结果的个数 不需要具体的字符串
字符串转换改进(暴力递归到动态规划)
甚至不需要看题意,直接根据暴力递归代码来改
背包问题
方法1
方法2
背包问题改进(暴力递归到动态规划)
列出dp表
题目 (非从左到右的模型)
问题改进(暴力递归到动态规划)
题目 n皇后问题
条件判断
优化:位运算 只是加速了常数时间
将列 左 右 或运算 就变成了总限制
进一步求下一步的总限制
代码
复杂度o(n^n)
如何在面试中尝试一件事
暴力递归到动态规划
题目 斐波那契数列
题目
有重复的子过程,可以优化
优化1 将cur和rest的组合,返回的结果,加入缓存中
这就是动态规划
dp表就是所有状态对应的值
暴力递归的分析规程 就是动态规划的转移方程 所有的动态规划都一定来着于一个暴力递归
暴力递归->记忆化搜索->经典动态规划(粒度更细)
题目
一个数组[7,3,100,52] 数组中每个位置的值是货币的面值,每一种面值都可以使用任意张,arr中都是正数,无重复值,假定目标钱是1000,问有几种方法可以组成1000这个面值.
暴力递归
记忆化搜索
经典动态规划
存在枚举行为
消除枚举的动态规划
题目二
小贪心
结论
**如果只有一个可变参数 而且情况太多 就直接用傻缓存吧 ** 可变参数不要超过整型以上
动态规划优化:空间压缩
多样本位置全对应的尝试模型
题目:两个字符串的最长公共子序列问题
dp[i][j]的求解
- 情况1 最大公共子序列可能既不以str1[i]结尾,也不以str2[j]结尾 dp[i][j]=dp[i-1][j-1]
- 情况2 最大公共子序列可能以str1[i]结尾,但不以str2[j]结尾 dp[i][j]=dp[i][j-1]
- 情况3 最大公共子序列可能不以str1[i]结尾,但以str2[j]结尾 dp[i][j]=dp[i-1][j]
- 情况4 最大公共子序列可能以str1[i]结尾,又以str2[j]结尾 dp[i][j]=dp[i-1][j-1]+1