leetcode总结

1. DFS  

a 搜,结果向下递。

b 递。结果往上传。

 如多叉树一些操作,树形dp(一般又是递归DFS),深搜剪枝,匈牙利算法(visit过的点不再visit),递归寻求可行解。。。


2. [双]线性扫描/loop

最简单的一维dp,只需要保存常数个而不是O(n)个值,我又叫他线性扫描大部分问题都可以用此方法。

线性扫描也可以很复杂,迭代量达到2个以上while I j(字符串处理中经常用,比如检查字符串是否是数字),while I j k。比如找水洼总装水量

线性扫描还可以难,难于找到这常数个有用的变量。比如两次买股票求最大收益,用最小/最大股价作为变量。

线性扫描还可以控制方向。如最大可行的括号序列长度,需要分别从左和从右扫描一次。最大矩形类似。

PS: 所谓【双】,指的是有可能同时迭代两个数组。如A[i]和B[j],str[i]和pattern[j]. 如正则匹配。

2.1 线性扫描+简单回溯


3. DP

一维dp 有的需要保存0~n-1的值从而推算n的值(比如KMP算法的next数组。 有的不需要,则跟线性扫描类似。

一维状态+一维枚举:a[n]=E{f(a[m])} 代表题目: word segments从左向右递归+枚举单词长度

二维dp(右下方推导居多,注意边界)如正则匹配(该题也可以用上面双线性扫描求解)。

二维状态+一维枚举:代表题目:最xx子矩阵

三维dp(可能可以降维) 

树形dp(融合了递归DFS+[分组 or 状态机]背包DP): 如HIHOCODER自驾旅行|||(找树的可往返最大权路径),找树的直径,


4. 数据结构,指针操作

链表排序,反转,找环,增删。

数壮数组,线段树,区间查询。

后缀自动机。

除此之外,常用的map迭代,list的iterator,set使用。


5. BFS宽搜

bfs用队列。典型:辅助找最短路。费用流中也有用。


6. 二分/三分

如两个有序数组求kth数,需要精密地控制二分点。


7. 其他特定算法

排序,字符串操作,位运算,大数计算,矩阵乘法加速等。

你可能感兴趣的:(leetcode)