九.labuladong公众号总结
一,算法刷题的框架思维
1.数据结构基本操作:查增删改,遍历
遍历:线性:for/while遍历(数组,链表),非线性:递归遍历(链表,二叉树)
2.二叉树是最容易培养框架思维的,而且大部分算法技巧,本质上都是树的遍历问题
所以二叉树的遍历非常重要,尤其递归遍历(回溯,动规,分治,只要涉及到递归的问题,都是树的遍历问题)
3.回溯算法就是一个N叉树的前后序遍历问题,没有例外
二,链表
1.对于链表的题目,双指针法运用很多
2.链表的两个技巧:双指针法,虚拟头节点
3.链表的递归操作也很多。比如遍历就可以递归遍历
4.N23合并k个有序链表。
创建优先级队列的时候,传入2个参数:队列大小,比较器。(构造的时候传入初始容量可以提高效率)
5.在快慢指针法中,fast=null && fast.next != null ,否则会发生空指针异常
6.算法题中的排序:Arrays.sort(),Collections.sort(),优先级队列
7.回文相关
解决此问题的核心是:双指针
反转字符串:reverse,双指针法 判读回文串:reverse,双指针法
(1)N125 判读回文串
(2)N5最长回文子串*** 有难度
(3)N516最长回文子序列*** 要用到动态规划
(4)N234回文链表*** 可以做一下,用到了链表的递归遍历
三.LRU
1.N146
(1)LinkedHashMap像是一个可以随机存取的双端队列
2.LFU
这个得熟悉LinkedHashMap源码,得熟悉HashMap源码
3.LinkedHashMap和TreeMap可以看做是一个双端队列,获取队头元素要用迭代器的next方法
4.N155最小栈
***判断两个变量是否相等时,一定要想一想是用==还是equals
设计循环队列和设计双端循环队列看看
4.单调栈,单调队列
栈的存取顺序相反,队列的存取顺序一致
四。二叉树
1.递归算法的关键是要明确这个函数的定义。写二叉树的算法题,都是基于递归框架的,我们先要搞清楚root节点它自己要做什么,然后根据题意选择使用前序,中序,后序的递归框架。
2.
五。回溯backtrack(第二次做随想录题目的总结)
1.回溯是一种搜索方式,通过dfs实现。回溯就是在遍历一棵决策树(N叉树)。因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度;递归的深度,构成的树的深度。for循环,横向遍历;递归,纵向遍历
2.回溯需要思考3个问题:路径,选择列表,结束条件
(递归需要思考三个问题:定义,选择列表,递归表达式(递归逻辑,递归实现))
3.回溯算法框架:
4.回溯算法就是在做选择
每个节点有两个属性:路径(所做的选择),选择列表
做的选择就是路径
5.(1)ArrayList(Collection c)构造方法
6.回溯可以解决:
题型一:排列,组合,子集问题
题型二:Flood Fill
题型三:字符串中的回溯问题
题型四:游戏问题
7.没做出来的题
8.全局变量可以放在参数里面,也可以放在外面
9.树层去重,需要对数组排序
10.遍历到叶子节点就结束了,其实真正的是遍历到叶子结点的下一层
11.去重:同一树枝去重,同一树层去重
同一树层去重需要先排序
12.组合和子集都不能回头,正因为不会头,所以不用建userd数组
排列可以回头
13.回溯最关键的是要把决策树画出来
14.N皇后问题
(1)字符默认为:'\u0000'(即空字符)