刷leetcode经常陷入刷了忘忘了刷的尴尬局面怎么办?
作者:互联网
放弃刷题后,我拿下了4家offer。分别是:**百度、Shopee(虾皮),蘑菇街和一家创业公司(字节三面挂,鹅简历挂)**。
我放弃盲目刷题的直接原因是——**效率真的是太低了**。来算笔账:
* LeetCode/LintCode的题目有近2000道,每天刷5道,刷穿要花1年半。
* 退而求其次,把每个知识点所覆盖的题目各刷10道,起码也要刷200道题,接近3个月。
![](https://upload-images.jianshu.io/upload_images/21269494-bf76998386355441.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
最重要的是,就算你刷了200+、300+题,也未必能通过算法面试。不信你点开LintCode,随机点开1题,如果你能马上找到思路并解出答案,那我只能说
![](https://upload-images.jianshu.io/upload_images/21269494-a4064a4da0088602.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
**在心里默念了无数次“我是傻逼”和进行了无数次无能狂怒后,我找到了一个“作弊神器”——算法小抄。**
这份算法模板是[《九章算法班》](https://www.jiuzhang.com/course/71/?utm_source=sc-csdn-fks)的令狐冲老师整理,包括了算法和数据结构的常见考点,列举了常见题目的**使用条件、复杂度、代码模板**,还附上了参考例题,感兴趣的朋友可以参考一下。
![](https://upload-images.jianshu.io/upload_images/21269494-5698eeb00399e278.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
接下来,奉上这份算法小抄的绝佳使用方式。
**Tips 1:打开[LintCode](https://www.lintcode.com/problem/?utm_source=sc-csdn-fks),筛选算法和数据结构知识点。**
![](https://upload-images.jianshu.io/upload_images/21269494-b1b153ce77fbd1a9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
拿二分举例。
* [LintCode14 . 二分查找](https://www.lintcode.com/problem/first-position-of-target/?utm_source=sc-csdn-fks)(在排序的数据集上进行二分)
* [LintCode460\. 在排序数组中找最接近的K个数](https://www.lintcode.com/problem/find-k-closest-elements/?utm_source=sc-csdn-fks)(在未排序的数据集上进行二分)
* [LintCode437.书籍复印](https://www.lintcode.com/problem/copy-books/?utm_source=sc-csdn-fks)(在答案集上进行二分 )
套上模板,时间复杂度:O(logn),空间复杂度:O(1)。
**Tips 2:根据模板,做题:**
```
public class Solution {
/**
* @param A an integer array sorted in ascending order
* @param target an integer
* @return an integer
*/
public int findPosition(int[] nums, int target) {
if (nums == null || nums.length == 0) {
return -1;
}
int start = 0, end = nums.length - 1;
// 要点1: start + 1 < end
while (start + 1 < end) {
// 要点2:start + (end - start) / 2
int mid = start + (end - start) / 2;
// 要点3:=, <, > 分开讨论,mid 不 +1 也不 -1
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
start = mid;
} else {
end = mid;
}
}
// 要点4: 循环结束后,单独处理start和end
if (nums[start] == target) {
return start;
}
if (nums[end] == target) {
return end;
}
return -1;
}
}
```
做完例题后再自己找几道题练练手,你基本就能把这套模板用得炉火纯青了。其他算法和数据结构知识点以此类推。用了一次后,我只想说——牛逼!
**当然,使用代码模板解题的前提是要学会判断这道题能用哪种方法解题**,令狐冲老师在[《九章算法班》](https://www.jiuzhang.com/course/71/?utm_source=sc-csdn-fks)里也做了整理:
**二分**
```
排序数组 (30-40%是二分)
当面试官要求你找一个比 O(n) 更小的时间复杂度算法的时候(99%)
找到数组中的一个分割位置,使得左半部分满足某个条件,右半部分不满足(100%)
找到一个最大/最小的值使得某个条件被满足(90%)
```
**双指针**
```
滑动窗口 (90%)
时间复杂度要求 O(n) (80%是双指针)
要求原地操作,只可以使用交换,不能使用额外空间 (80%)
有子数组 subarray /子字符串 substring 的关键词 (50%)
有回文 Palindrome 关键词(50%)
```
**BFS**
```
拓扑排序(100%)
出现连通块的关键词(100%)
分层遍历(100%)
简单图最短路径(100%)
给定一个变换规则,从初始状态变到终止状态最少几步(100%)
```
**二叉树与分治**
```
二叉树相关的问题 (99%)
可以一分为二去分别处理之后再合并结果 (100%)
数组相关的问题 (10%)
```
更多算法和数据结构的使用条件,可以听令狐冲老师的免费讲座[《FB面试官揭秘面试技巧:如何刷100题胜过别人刷300题》](https://www.jiuzhang.com/course/71/?utm_source=sc-csdn-fks)。
如果你能把这套模板摸清楚,遇到题目基本都能轻松破解,**从刷了忘、忘了刷变成每刷一遍就巩固一遍代码模板**,直到把它记熟记透,在面试中做到游刃有余。
接下来分享一个核心观点:**刷题是为了应对面试,因此我们要针对性地刷题,不刷无意义的题**。
所以,除了背熟模板,我备战面试的基本策略是在面试前2周突击刷该公司的**面试真题、高频题**。可以在LintCode的[阶梯训练](https://www.lintcode.com/ladder/?utm_source=sc-csdn-fks)上刷对应的企业真题。
![](https://upload-images.jianshu.io/upload_images/21269494-84dd35e8128adda2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
正式成为社畜后,我也不再抱着那么功利的心态去刷题。现在我每周会刷2-3道题,更多的是锻炼自己的逻辑思维能力,也为了预防一些不时之需(如跳槽)。
现在刷题反而会给我一种别样的快乐,尤其是找到了一种新的思路解题,或是攻克了之前一直感到头疼的动态规划。
**当你获得了这种满足和成就感,刷题对你来说就不再是一件痛苦的事,也就不会陷入“刷了忘忘了刷”的困局了。**
标签:陷入,end,nums,upload,start,尴尬,https,images,leetcode 来源: https://blog.csdn.net/JiuZhang_ninechapter/article/details/111640053