经验总结 | 刷题两年,秒杀 medinum 题目

先来自我介绍一下,2020 fall,拿到了4个面试,3个onsite。刷题两年,断断续续,目前为止总共刷了500+。 刷题的数量只能说一般,主要是刷题的方法,刷什么题,怎么刷题,如何有效的刷题。希望能通过这份经验总结帮助到大家,掌握刷题技巧。

对于面试中所有的 medium 算法题目, 基本都可以秒杀。只有第一个面试挂了(挂在面试技巧上面了),另外三个 onsite 全部拿到offer了。今天就来跟大家聊聊这刷题两年来积累的一些个人感想和一些对算法的理解。

刷题路径

1. 刷easy题。主要寻找做题的感觉。理解算法的基本思路。

2. 刷 linkedlist, tree。原因一是面试中这两类题考的频率较高,原因二是刷这两类题有助于对递归算法的理解, 为后面刷 DFS 打下算法基础。

3. 刷 DFS。DFS 非常重要。因为大部分 brute force 基本都可以用 dfs 来求解。刚开始刷DFS, 可以重点关注 pemutation 和 combination 之类的算法题目, leetcode 这两类算法题也挺多的。然后开始总结, 去理解 “状态(state)” 这个概念,对于每道 DFS 算法问题, 要清晰的定义出 “状态(state)”, 以及状态如何转移, 这方面的基础可以为 DP 算法打下刷题基础。

之前我也参加了 Justin 老师的算法 Camp 课程,对我刷题的帮助也比较大。

4. 记忆化搜索。也就是DFS + 记忆。记忆的存储通常用 map 或者 set 即可5. DP。记忆化搜索刷熟了,可以尝试开始刷经典的 DP 算法,理解 状态 和 状态转移,尝试自己去写出状态转移方程。尝试 DP 的两种实现方式 top-down(也就是记忆化搜索) 和 bottom-up。经验总结 | 刷题两年,秒杀 medinum 题目_第1张图片

6. 高频数据结构, stack, queue, heap。这三个数据结构在面试中出现频率非常高。

7.算法和数据结构学习应该有怎么样的顺序?我个人犯的错误就是前期刷题质量和效率太低,埋了很多雷。

首先二分查找左闭右开的 lower_bound 写法一定要理解。这是一种思想而不是简单的查找数值。排序的话,快排和快排的切分默写程度吧。3向快排和归并排序也要能默写。

接下来谈谈栈和队列的运用。基于栈 LIFO 的数据结构特点,DFS 的刷题——非递归肯定用栈啦。单调性栈算法的运用,这个需要自己去体会,队列的话 FIFO 特点 BFS 肯定用得上了,BFS 问题比如课程表、接雨水Ⅱ。

优先队列用在哪里?topk 系列问题以及依赖于优先队列的 BFS 遍历。二叉堆和二叉树,高度、深度、叶子结点、非叶子节点,这个需要理清楚。二叉树基本上用递归算法为主了。

遍历方式:递归、非递归、morris遍历、高度和深度计算。链表的话考察的比较少,环检测、翻转链表必须会。树状数组、ST 表就是一个二进制倍增思想的运用,这个在 Justin 老师的心法课里面有提及。UF 的话,也比较常见,刷题碰到的比较简单,要么连通性判断,要么连通图个数计算。

8.刷题用什么语言:从功利性角度来看,JAVA、C++比较稳了。毕竟 leetcode 答案语言版本也是这2种最为常见。Python答案代码是少,代码少并不代表你就能容易理解这个答案。所以leetcode讨论区经常会有 show 几行 Python 算法代码 solution,我觉得这并没有提供有效的信息。

9. 其他重点专题: sliding window, sort(特别是快速排序和归并排序的算法), two pointers, graph, bfs, trie, union find

刷题方式

我通常会结合不同的刷题方式。

  1. 只看题,不写代码。我通常会从 brute force 开始求解, 然后逐步优化。如果10-20分钟以内想不出解法, 直接去看答案了。
  2. 对于一道题, 精耕细作, 举一反三。精耕细作是指 学习优秀代码, 一题多解 以及 如何从brute force 推导到最优解,并且了解这个过程的思路是如何形成的。举一反三是指看类似的题目, 总结共同特性。
  3. 参加竞赛。训练快速做题,debug ,写代码的能力。

经验总结 | 刷题两年,秒杀 medinum 题目_第2张图片

其他 tips

  1. 刷题初期追求量,一道题不可花太长时间, 控制在30分钟以内
  2. 最好不依赖IDE, 训练直接在leetcode 页面写代码。
  3. 定期回过头总结刷过的题,理解其中算法的精髓。
  4. 不要盲目刷题, 适可而止,刷够了,要转战到面试技巧上面,面试技巧和刷题一样重要。(因为我就有一个面试挂在面试技巧上面, 非常后悔)

刷题感悟:理解子问题。对于每一个问题,定义子问题是什么,然后如何从子问题推导出原问题的解。对于 DFS,就是穷举每个子问题。DP 算法就是因为存在重叠子问题。贪心算法就是每次以子问题的最优解作为原问题的最优解。经验总结 | 刷题两年,秒杀 medinum 题目_第3张图片

我个人认为自己的学习能力一般,我觉得大家的能力怎么着都会比我更好,所以如果遇到学习上的问题,也请保持自信。

希望可以帮助到大家!
以上是个人经验总结, 欢迎大家讨论。

如果大家想要更深入的了解这方面的经验,欢迎大家添加我的微信号,L13509543893。大家一起努力一起学习~注明来意+简历即可!

你可能感兴趣的:(算法leetcode刷题)