• 技巧: 血的教训
      • 疯狂写注释,帮助大脑思考
      • 与现实操作映射起来,一定要
        • 快排的那个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);
    • 堆结构
      • 堆中某个节点的值总是不大于或不小于其父节点的值;
      • 堆总是一棵完全二叉树。
    • 这么交换数组有大坑!!!!
      1. public void swap(int[] a, int i, int j) {
      2. if(i == j) return;
      3. a[i] ^= a[j];
      4. a[j] ^= a[i];
      5. a[i] ^= a[j];
      6. }