前言
说起LeetCode,作为一个程序员来说,应该都不会感到陌生,就在近几年里参加面试都会提到它。国内外的程序员都用它刷题主要原因是为了面试。据历史记载,这个网站2011年就已经成立了,马上就要到自己10周年的生日了。每周举行周赛,双周赛,月赛,在有限时间内编码,确实非常能考验人的算法能力。一些大公司赞助冠名的比賽获得前几名除了有奖品,还能直接拿到内推的机会。奖励可谓极其丰厚
想必大家都知道在国内BAT等众多一线名企,在招聘工程师的过程中,对算法和数据结构都会重点考察。不过算法易学难精,大家可能技术能力都很不错,但面试时往往总败在算法这一关, 拿不到好Offer。但说实话,数据结构和算法花点时间,对方法,很容易解决。面试官为什么爱问数据结构与算法,原因有4点:
-
算法能力能够准确辨别一个程序员的技术功底是否扎实;
-
算法能力是发掘程序员的学习能力与成长潜力的关键手段;
-
算法能力能够协助判断程序员在面对新问题时,分析并解决问题的能力;
-
算法能力是设计一个高性能系统、性能优化的必备基础。
国外流行让面试者编程解决某些数据结构和算法的题目,通过观察面试者编码的熟练程度、思考的速度和深度来衡量面试者的能力和潜力。国内以字节跳动、百度、阿里、腾讯等等为首的互联网企业采用算法面试来筛选人才。
由此可见算法在我们面试过程中是非常重要的,无论是大厂还是传统企业面试基本上都是要问到算法,想拿到一个好offer,算法必须要吃透,那么如何高效刷题呢?下面我们就来看看这几份标星70K的刷题宝典吧
算法刷题宝典
由于笔记涉及到的知识点十分全面,无法一一全部展现出来,为了不影响大家的阅读体验,以下只展示部分笔记内容以供大家参考,如需完整版笔记的朋友可以一键三连之后添加小助理vx:kaixindian331即可获取到了
第一部分算法专题
Linked List
-
巧妙的构造虚拟头结点。可以使遍历处理逻辑更加统一。
-
灵活使用递归。构造递归条件,使用递归可以巧妙的解题。不过需要注意有些题目不能使用递归,因为递归深度太深会导致超时和栈溢出。
-
链表区间逆序。第92题。
-
链表寻找中间节点。第876题。链表寻找倒数第n个节点。第19题。只需要-次遍历就可以得到答案。
-
合并K个有序链表。第21题,第23题。
-
链表归类。第86题,第328题。
-
链表排序,时间复杂度要求0(n * log n),空间复杂度0(1)。只有一种做法,归并排序,至顶向下归并。第148题。
-
判断链表是否存在环,如果有环,输出环的交叉点的下标;判断2个链表是否有交叉点,如果有交叉点,输出交叉点。第141题,第142题,第160题。
Segment Tree
Stack
-
括号匹配问题及类似问题。第20题,第921题,第1021题。
-
栈的基本pop和push操作。第71题,第150题,第155题,第224题,第225题,第232题,第946题,第1047题。
-
利用栈进行编码问题。第394题,第682题,第856 题,第880题。
-
单调栈。利用栈维护-个单调递增或者递减的下标数组。第84题,第456题,第496题,第503题,第739题,第901题,第907题,第1019题。
第二部分一些模板
-
线段树Segment Tree
-
并查集UnionFind
第三部分Leetcode题解
接近1000+题目以供大家刷题,“颤抖吧,骚年”( ′◔ ‸◔`)
42. Trapping Rain Water
378. Kth Smallest Element in a Sorted Matrix
693. Binary Number with Alternating, Bits
802. Find Eventual Safe States
836. Rectangle Overlap
885. Spiral Matrix III
999. Available Captures for Rook
1105. Filling. Bookcase Shelves
1145. Binary. Tree Coloring Game
1254. Number of Closed Islands
1302. Deepest Leaves Sum
第二份算法宝典
为什么要做这样的一个算法图解合集
网上的算法教程杂乱且分散,质量层次不齐,浪费了大家大量宝贵的时间。很多题解,在我掌握题目后去看都费劲,更何况对于一些初学者。
学习指南
本教程阅读门槛
本教程基本没有学习门]槛。因为在每道题目中,我都会尽量去串基础知识,以达到学以致用的效果。
学完本教程期望达到什么样的目的
-
掌握基本的数据结构与算法
-
掌握各类型高频面试算法题
本教程有何特色
每一道算法题都配有完整的图解!仅此一家!
题解是围绕什么编写的
掌握!所有的题解都以掌握二字为前提。不会追求过多的奇淫技巧,毕竟我们不是专门研究算法的人。我见过太多算法初学者, 一个题解看不懂,转头又去看第二个题解,第二个看不懂,又去看第三个,直到最后放弃掉。浪费了时间,题目还是不会做,这图什么呢?所以本教程所有的题解都是以掌握为目标,尽量把每一道题的思路都讲的明明白白的。
题解是否严谨
绝对严谨,所有的题解都在leetcode,上进行过测试运行。
没学过java、go是否可以学习
当然可以。我期望大家更多的是去关注算法的本身,而不是语言层面的东西。所以本教程,其实各语言都会使用一些,并不局限于java、go。但是,我绝对不会使用任何语法特性!我希望大家不要被语言所束缚!
是否可以按照本教程顺序来刷题
当然可以。一般刷题我们有两种策略, 一种就是刷leetcode前一百道题目,另一种就是根据分类刷Leetcode前一百道题,是因为这些题目都是经典题目。而根据分类,更适合算法小白和初中阶段读者。所以我在这里选择了根据分类来汇编,这样我们还可以在做一些题目的时候,与前面同类型的题目进行比较。
你需要做什么
开干!奥利给!
数组系列
旋转数组(189)
链表系列
删除链表倒数第N个节点(19)
动态规划系列
三角形最小路径和(120)
打家劫舍(198)
字符串系列
反转字符串(301)
二叉树系列
最大深度与DFS(104)
BST的删除(450)
二叉树的剪枝(814)
滑动窗口系列
博弈论系列
位运算系列
2的幂(231)
二分法系列
其他题目
飞机座位分配概率(1227)
三门问题
由于笔记涉及到的知识点与内容极多,就不一一展示给大家了,若需要完整版两份《力扣算法刷题宝典》的朋友,vx:kaixindian331
总结
对想去国内外大公司就职的程序员来说,算法题这一关是必不可少的。其实只要掌握题目的解题思路和思想,就足以应付国内互联网公司程序员职位的算法面试题。不过,要想去国外的大公司,比如Google、Facebook之类的,还是要研究得透彻一些才行。
另外,除应付面试之外,还有很重要的一点,甚全是更重要的一点,就是这份《算法刷题宝典》可以布我们打开思路,因为很多算法题的解法是需要逆向思维的,需要跳出原有的固定思维模式,当思维模式被打开之后,你会发现原有的事物现在看起来会有不同的看法,因为角度变了。不过这只能自己体会。
祝每一位勤奋努力的程序员都能拿到自己满意的职位!