0%

LeetCode 笔记

这是我 2019 年秋招过程中刷 LeetCode 做的笔记。

双指针法

适用于这样一种情形:需要确定一个范围作为解,使得目标函数取值最大。
用左右两端两个指针代表该范围,则:
如果在任意时刻,一定可以有至少一端,只要调整这一段就会使得目标函数取值变小;且如果只调整这一端的话,目标函数永远不会超过当前时刻的目标函数取值。那么,如果存在优于当前情况的解,迟早要调整另一端。所以,调整另一端一定不会错过最优解。

排序

快速排序
归并排序

递归和回溯

遍历二叉树

动态规划

举行重叠

判断角点

拓扑排序

LeetCode-207. 课程表
参考:https://www.jianshu.com/p/3347f54a3187

如果一个有向图为有向无环图(Directed Acyclic Graph, DAG),就能得到对应该图的拓扑排序,满足这样的条件:对于图中任意两个节点 u 和 v,若从 u 到 v 存在一条边,则拓扑排序中 u 一定排在 v 前面。

对于一个有向图,找到其一个拓扑排序的算法:

  1. 初始化一个数组 in_degree 用于保存每个结点的入度;
  2. 对图中每一个结点的子结点,使其入度加 1;
  3. 选取入度为 0 的结点加入输出(拓扑排序);若无法找到入度为 0 的结点,则说明原有向图存在环,不存在对应的拓扑排序;
  4. 对输出结点,遍历其子结点,每个子结点的入度减 1;
  5. 重复步骤 3-4,直至遍历完所有结点。

其他 Tips

  • 对数组进行操作时,试试排序后能否简化思路。
  • 当考虑用 Hashmap 来判别对象的唯一性时,尝试采用其他 Coding 方案,比如当 Hashmap 的 Keys 在一个固定范围内时(如小写字母),就可以采用固定长度的数组来实现 Coding。