前言
这几年IT技术蓬勃发展,日新月异,对技术人才的需求日益增长,程序员招聘市场也如火如荼。在有限的三五轮面试中,国外流行让面试者编程解决某些数据结构和算法的题目,通过观察面试者编码的熟练程度、思考的速度和深度来衡量面试者的能力和潜力。国内以百度、阿里、腾讯为首的互联网企业也都逐步开始采用算法面试来筛选人才。
众所周知,很多大厂技术面试的要求是:技术要好,计算机基础扎实,熟练掌握算法和数据结构,语言不重要,熟练度很重要。每一轮技术面试都可能考代码,不只考算法,但一定会考算法。
算法作为大厂面试必备的一个环节!所以要想被录取就必须依靠牢固的基础和刷题量。算法根基不扎实,不仅难过面试,对于代码性能的提升、编程语言的驾驭也会比别人弱很多。因此,现在算法基础不牢固的同学,都很难通过大厂的面试。
所以说:算法作为大厂的试金石也不为道理的
下面我们就来看看这份在GitHub标星7W的算法刷题宝典吧
目录
第一章、动态规划系列
动态规划问题有难度而且有意思,也许因为它是面试常考题型。不管你之前是否害怕动态规划系列的问题,相信这一章的内容 足以帮助你消除对动态规划算法的恐惧。
- 动态规划设计:最长递增子序列
- 经典动态规划: 0-1 背包问题
- 经典动态规划:完全背包问题
- 经典动态规划:子集背包问题
- 经典动态规划:编辑距离
- 经典动态规划:高楼扔鸡蛋
- 经典动态规划:高楼扔鸡蛋(进阶)
- 经典动态规划:最长公共子序列
- 动态规划之子序列问题解题模板
- 动态规划之博弈问题
- 动态规划之正则表达
- 动态规划之四键键盘
- 动态规划之KMP字符匹配算法
- 贪心算法之区间调度问题
- 团灭LeetCode股票买卖问题
- 团灭LeetCode打家劫舍问题
背包问题
描述:给你一个可装载重量为W的背包和N个物品,每个物品有重量和价值两个属性。其中第i个物品的重量为wt[i],价值为val[i],现在让你用这个背包装物品,最多能装的价值是多少?
背包问题变体之子集分割
上面我们提到了 经典动态规划: 0-1背包问题详解了通用的0-1 背包问题,今天就来看看背包问题的思想能够如何运用到其他算法题目。
而且,不是经常有读者问,怎么将二维动态规划压缩成一维动态规划吗?这就是状态压缩,很容易的,本文也会提及这种技巧。
高楼扔鸡蛋
今天要聊一个很经典的算法问题,若干层楼,若干个鸡蛋,让你算出最少的尝试次数,找到鸡蛋恰好摔不碎的那层楼。国内大厂以及谷歌脸书面试都经常考察这道题,只不过他们觉得扔鸡蛋太浪费,改成扔杯子,扔破碗什么的。
具体的问题等会再说,但是这道题的解法技巧很多,光动态规划就好几种效率不同的思路,最后还有一种极其高效数学解法。秉承咱们号一贯的作风,拒绝奇技淫巧,拒绝过于诡异的技巧,因为这些技巧无法举一反三,学了也不划算。
下面就来用我们一直强调的动态规划通用思路来研究一下 这道题。
最长公共子序列
博弈问题
四键键盘
四键键盘问题很有意思,而且可以明显感受到:对dp数组的不同定义需要完全不同的逻辑,从而产生完全不同的解法。
区间调度问题
打家劫舍问题
打家劫舍系列总共有三道,难度设计非常合理,层层递进。第一道是比较标准的动态规划问题,而第二道融大了环形数组的条件,第三道更绝,把动态规划的自底向上和自顶向下解法和二叉树结合起来,我认为很有启发性。如果没做过的朋友,建议学习一下。
下面,我们从第一道开始分析。
第二章、数据结构系列
这一章主要是一些特殊的数据结构设计,比如单调栈解决Next GreaterNumber,单调队列解决滑动窗口问题;还有常用数据结构的操作,比如链表、树、二叉堆。
- 算法学习之路
- 二叉堆详解实现优先级队列
- LRU算法详解
- 二叉搜索树操作集锦
- 如何计算完全二叉树的节点数
- 特殊数据结构:单调栈
- 特殊数据结构:单调队列
- 设计Twitter
- 递归反转链表的一部分
- 队列实现栈栈实现队列
LRU算法详解
快速计算完全叉树的节点
如果让你数一下一棵普通二叉树有多少个节点,这很简单,只要在二叉树的遍历框架上加一点代码就行了。但是,如果给你一棵完全二叉树, 让你计算它的节点个数,你会不会?算法的时间复杂度是多少?这个算法的时间复杂度应该是O(ogN*logN),如果你心中的算法没有达到高效,那么本文就是给你写的。
单调队列
前文讲了一种特殊的数据结构「单调栈」monotonic stack,解决了一类问题「Next Greater Number」,本文写一个类似的数据结构「 单调队列J。
队列实现栈|栈实现队列
第三章、算法思维系列
本章包含一些常用的算法技巧,比如前缀和、回溯思想、位操作、双指针、如何正确书写二分查找等等。
- 回溯算法团灭子集、排列、组合问题
- 回溯算法最佳实践:解数独
- 回溯算法最佳实践:括号生成
- 滑动窗口技巧
- twoSum问题的核心思想
- 常用的位操作
- 拆解复杂问题:实现计算器
- 烧饼排序
- 前缀和技巧
- 字符串乘法.
- Floodi算法详解及应用
- 区间调度之区间合并问题
- 区间调度之区间交集问题
- 信封嵌套问题
- 几个反直觉的概率问题
- 洗牌算法
- 递归详解
烧饼排序
烧饼排序是个很有意思的实际问题:假设盘子上有n块面积大小不一的烧饼,你如何用把锅铲 进行若干次翻转,让这些烧饼的大小有序(小的在上,大的在下) ?
FloodFilI算法详解及应用
啥是FloodFill算法呢,最直接的一一个应用就是「 颜色填充」就是Windows绘画本中那个小油漆桶的标志,可以把一块被圈起来的区域全部染色。
区间交集问题
本文是区间系列问题的第三篇,前两篇分别讲了区间的最大不相交子集和重叠区间的合并,今天再写一个算法,可以快速找出两组区间的交集。
信封嵌套问题
很多算法问题都需要排序技巧,其难点不在于排序本身,而是需要巧妙地排序进行预处理,将算法问题进行转换,为之后的操作打下基础。
信封嵌套问题就需要先按特定的规则排序,之后就转换为-一个最长递增子序列问题,可以用前文二分查找详解的技巧来解决了。
第四章、高频面试系列
本章都是高频面试题,配合前面的动态规划系列,祝各位马到成功!
- 如何高效寻找素数
- 如何高效进行模幂运算
- 如何运用二分查找算法
- 如何高效解决接雨水问题
- 如何去除有序数组的重复元素
- 如何寻找最长回文子串
- 如何运用贪心思想玩跳跃游戏
- 如何k个一组反转链表
- 如何判定括号合法性
- 如何寻找缺失的元素
- 如何同时寻找缺失和重:复的元素
- 如何判断回文链表
- 如何在无限序列中随机抽取元素
- 如何调度考生的座位
- Union-Find算法详解
- Union-Find算法应用
- 一行代码就能解决的算法题
- 二分查找高效判定子序列
接雨水问题详解
接雨水这道题目挺有意思,在面试题中出现频率还挺高的,本文就来步步优化,讲解一下这道题。
一、核心思路
二、备忘录优化
经典贪心算法:跳跃游戏
说白了,贪心算法可以理解为一-种特殊的动态规划问题,拥有-些更特殊的性质,可以进一步降低动态规划算法的时间复杂度。那么这篇文章,就讲LeetCode.上两道经典的贪心算法:跳跃游戏I和跳跃游戏II。
如何寻找消失的元素
随机算法之水塘抽样算法
我第一次见到这个算法问题是谷歌的一道算法题:给你一一个未知长度的链表,请你设计一个算法,只能遍历一次,随机地返回链表中的一一个节点。
二分查找高效判定子序列
二分查找本身不难理解,难在巧妙地运用二分查找技巧。对于一个问题,你可能都很难想到它跟二分查找有关,比如前文最长递增子序列就借助一个纸牌游戏衍生出二分查找解法。
由于篇幅原因,仅展示资料部分截图,需要这两份完整算法笔记的朋友,关注我+点赞本文给更多有需要的人,最后【见下图】,即可获得资料免费领取方式哦~童叟无欺!!!
看看下一份刷题宝典
又是一份高质量算法刷题宝典
第二份算法算题宝典
学习指南
数组系列
两个数组的交集
02、题解分析
首先拿到这道题,我们基本马上可以想到,此题可以看成是一道传统的映射题(map映射),为
什么可以这样看呢,因为我们需找出两个数组的交集元素,同时应与两个数组中出现的次数一
致。这样就导致了我们需要知道每个值出现的次数,所以映射关系就成了<元素,出现次数>。剩下的就是顺理成章的解题。
由于该种解法过于简单,我们不做进一步分析, 直接给出题解:
03、题目进阶
题目在进阶问题中问道:如果给定的数组已经排好序呢?你将如何优化你的算法?我们分析一下,假如两个数组都是有序的,分别为: arr1 = [1,2,3,4,4,13],arr2= [1,2,3,9,10]
对于两个已经排序好数组的题,我们可以很容易想到使用双指针的解法~
解题步骤如下:
<1>设定两个为0的指针,比较两个指针的元素是否相等。如果指针的元素相等,我们将两个指针一起向后移动,并且将相等的元素放入空白数组。下图中我们的指针分别指向第一个元素,判断元素相等之后,将相同元素放到空白的数组。
最长公共前缀
01、题目分析
02、题解分析
03、代码分析
买卖股票的最佳时机
01、题目分析
而且这一类型的题,面试时出现的频率非常的高。稍微改一改条件,就让我们防不胜防。那我们如何攻克这一类题型呢?我们从最简单的一道开始看起:
02、题解分析
链表系列
环形链表
今天为大家带来,链表检测成环的经典题目。如果你觉得你会了,请你不妨耐心些认真看下去,我相信会有一些不一样的收获!还是先从一道题目开始哟,准备好了吗? Let' s go !
01、题目分析
02、题目分析
哈希表判定
题解三:双指针解法
动态规划系列
爬楼梯
01、概念讲解
02、题目分析
03、图解分析
最小路径和
在上一篇中,我们通过分析,顺利完成了“三角形最小路径和”的动态规划题解。在本节中,我们继续看一道相似题型,以求能完全掌握这种"路径和”的问题。话不多说,先看题目:
01、题目分析
02、题目图解
打家劫舍
在前两篇中,我们分别学习了“三角形最小路径和”以及“矩形最小路径和"的问题,相信已经掌握了这类题型的解题方式。我们只要明确状态的定义,基本上都可以顺利求解。
在本节中,我们将回归一道简单点的题目,目的是剖析一下状态定义的过程,并且举例说明如果状态定义错误,会对我们带来多大困扰!希望大家不要轻视
01、题目分析
02、题目图解
字符串系列
反转字符串
字符串中的第一个唯一字符
二叉树系列
最大深度与DFS
平衡二叉树
在之前的系列中,我们已经学习了二叉树的深度以及DFS,如果不会可以先查看之前的文章。今天我们将对其进行应用,直接看题目。
滑动窗口系列
滑动窗口最大值
有读者小伙伴建议讲一 下滑动窗口相关题型,因为经常面试会被问到。所以就开了这个系列(所以如果大家有想让分享的题型都可以留言区告诉我,任何事情我觉得都需要有反馈。比如一个错你不反馈,我不知道.那就只能这样过去了..)闲话不哕嗦,直接看题!
博弈论系列
囚徒困境
海盗分金币
在面试的过程中,除了常规的算法题目,我们经常也会被问到一些趣味题型来考察思维,尤其以FLAG (Facebook, LinkedIn, Amazon, Google)等公司为典型。而这类问题的背后,很多都有博弈论的影子。所以在本系列,我将为大家分享一整套需 要掌握的博弈论相关知识,希望大家可以喜欢。
- 足智多谋,总是采取最优策略。
- 贪生怕死,尽量保全自己性命。
- 贪得无厌,希望自己得到越多宝石越好
- 心狠手辣,在自己利益最大的情况下希望越多人死越好。
- 疑心多虑,不信任彼此,尽量确保自身利益不寄希望与别人给自己更大利益。
由于笔记涉及到的知识点与内容极多,就不一一展示给大家了,这两份算法算题宝典分别为666、245页,若需要完整版笔记的朋友,可以转发此文关注小编,【见下图】来获取!!
总结
码农们,你们做好准备在IT名企的面试中脱颖而出、一举成名了吗? 这本书就是你应该拥有的“神兵利器”。当然,对需要提升算法和数据结构等方面能力的程序员而言,笔记的价值也是显而易见的。帮助广大程序员的面试准备做到万无一失。 “刷”完这些后,你就是“题王”!