- 技巧: 血的教训
- 疯狂写注释,帮助大脑思考
- 与现实操作映射起来,一定要
- 快排的那个pivot的参数就是;不映射就会乱套了
- 快慢节点时候,是可以在起点错开的
- 一定要注意好边界条件(指双链表指针)
- 没读好题,上来就是快慢节点,要求倒数第n个,而我是中间的,并且也不是快慢节点的提醒,乱用。。。。
- 数组0的位置用来作为初始值,别用MIN,MAX,防止越界
- 树的递归忘记了+1
- stack的pop忘了判断
- 最小子路径、子数组,是否允许0的问题
- 最大路径和那道题目关于特殊情况的问题又卡住了。。。负数和0的情况
- 要保证max运算的结果一定都是有节点的
- 犯了和子序和一样的问题,without没有作用
- 为什么最大路径这道题目,辅助函数的区别,导致结果差这么多?
- curlen问题: 动态规划中的遗弃情况;最大子序和;最长自增列
- 手写代码时候要注释上每个参数的意义
- 很有用,血的代价
- 各种算法关键词
- DFS、BFS、回溯
- 前序、中序、后续
- 递归
- 思维降级
- 贪心算法、动态规划、暴力法
- 单调栈法
- 并查集
- 链表特定位置
- 快慢指针
- 链表删除
- 链表的前驱
- 自然数组
- Stack类的设计问题
- 底层Vector,扩容性能差
- has-a,不应该is-a
- 使用这个:Deque
stack = new LinkedList<>();
二分法的敏感性
- 二分法的边界问题!!!
- 问题转化到这里,直接套用二分法即可,即不断用二分法逼近查找第一个大于等于 \textit{target}target 的下标 。下文给出的代码是笔者习惯的二分写法,\textit{ans}ans 初值设置为数组长度可以省略边界条件的判断,因为存在一种情况是 \textit{target}target 大于数组中的所有数,此时需要插入到数组长度的位置。
- 二分法的边界问题!!!
最值问题的循环顺序
- 面试官的课件
- List
- > ans = new ArrayList
- >();
- StringBuilder.deleteCharAt(1);
- 堆结构
- 堆中某个节点的值总是不大于或不小于其父节点的值;
- 堆总是一棵完全二叉树。
- 堆中某个节点的值总是不大于或不小于其父节点的值;
- 这么交换数组有大坑!!!!
public void swap(int[] a, int i, int j) {if(i == j) return;a[i] ^= a[j];a[j] ^= a[i];a[i] ^= a[j];}
