前言(Live in front)

双非一本大三,最近拿到了大厂的算法 Offer,没想到兜兜转转最后还是过来搞算法。

一想到自己以后还是要搞算法,还是决定重新系统的学习算法,以及几何相关的知识。

以此文为鉴,不断成长。

如何系统的学习算法

知乎上的一些文章(文章一文章二)。

其实说的不外乎就是有条理的去学,一块一块练。

那这里的话我会比较推荐这个算法小抄

学习ing

数据结构

数据结构存在的意义就是储存和处理数据。

所以说数据结构本质都是一样的(增删改查),但是在不同的应用场景中,不同数据结构的效率不同。

在业务中考虑用哪种数据结构时,问一下自己需要什么(比如需不需要随机访问),增删改查哪个比重更高。

链表

86. 分隔链表

So stupid.

居然把分隔链表想的这么复杂,一直想着在一条链表上操作,明明只要分成两条就会很简单。

节点移动的时候要断链,不然引用会乱,但是这样原有的 List 就断掉了。

1
2
3
ListNode* temp = node->next;
node->next = nullptr;
node = temp;

二叉树

1
2
3
4
5
6
7
8
9
//递归遍历单链表
void traverse(ListNode* head) {
if (head == nullptr) {
return;
}
//前序位置
traverse(head -> next);
//后序位置
}

这个思路真的很厉害。

算法

本质是穷举。

所以说就是要思考,怎么样才能穷举(必然有规律,不然做不到不遗漏和不重复),再思考如何去剪枝(什么情况不用穷举)。

一切算法均为模板

笔试须知

因为大部分算法小抄都是 LeetCode 的,但是大厂笔试一般都用牛客的 acm 模式,也就是说需要我们自己去处理数据。

虽然 LeetCode 的模式更加贴近工作,但是牛客的 acm 模式能更深入的考察数据结构。

所以还是建议笔试前刷一会牛客的中难题,训练自己整理数据的能力。