30天刷爆剑指offer改装版专题
必读
LeetCode没有剑指offer了?
PS:力扣确实没有剑指Offer的版权了,但是力扣换汤不换药,把剑指Offer的题目和描述都改了 ,但是意思不变,但是根据我的链接直达即可,不影响刷题。
一、关于刷题的几点疑问解答
首先在刷题之前,我们先说我一直被问的问题。
1、我不是Java的可以吗?
答案是可以的,因为我本质是给你们安排题型,让你们刷起来更加顺畅,你题解可以在leetcode看。另外,我这里也有录制了一个视频题解,虽然题解是 Java,不过重点讲解思路,只要你学过面向对象的语言,看懂还是问题不大。
并且帅地的题解了,提供了五种代码:Java,C++,Python,Go,JS,基本满足所有用户
2、如果一道题不懂,是要想多久才能看答案呢?
如果一点思路也没有,那么请几分钟后就看答案吧,不用憋着不看,看答案没问题的,大家都是这么过来的,就是看完之后,自己也要写一下代码,提交=》运行。千万不要憋大半天哈,0思路的,两三分钟就可以看答案了,有思路的,可以试着写一写代码。
能暴力则暴力,之后再自己优化成最优解。
3、刷完忘了正常吗?
非常正常,只刷一次,不懂的题,过阵子可能又得想很久了,所以这里是建议大家要刷2~3次,至少 2 次,3次可以,4次很稳,一般都这样,当然,这个是以后再去刷了。比如再次参加活动啥的。
另外就是,不要去背代码哈,这玩意必须理解。
4、剑指offer对应啥难度?
这个系列大部分是经典题,困难:中等:容易 = 1 : 3 : 3,对标互联网公司算法面试的难度,是面试,不是笔试哦。
5、刷这个系列我需要掌握什么?
你需要学过基本的数据结构,比如学过链表,队列,栈,二叉树。不懂的可以自己去补一下哈,算法全套有这些。
三、刷题前的一些指标说明
我会给每道题进行两个维度的标注 ★,分别是难易程度 + 要求掌握的力度,标注的时候,一共有 5 个 ★,星星越多,代表越难,也代表重要程度越高。
并且我会对一些重要的题做出一些提示,很简单或者没啥技巧的,我就不做太多提示了。
四、本网站的一些使用技巧
有时候你们点击链接,新的网页在原来的窗口打开,导致大家丢失了当前窗口,对于这种,大家可以右击鼠标=》选择新窗口打开哈。
专题一:链表
学链表我们需要掌握什么?
链表在面试中出现频率排行前2的算法题,因为链表题的特点是:描述非常简单,基本不用花时间去读题,在面试有些的三四十分钟里,链表非常受欢迎。
我们先来说一说学习链表时,我们最需要掌握的是什么?
首先我认为大部分的链表题,解法思路都相对简单,双指针占一半以上,但是上了战场,写链表题的时候,非常容易出错,常见错误是:
1、没有考虑节点为 null 导致空指针异常。
2、容易出现节点位置定位出错,比如往前多走了一步,或者少走了一步。
所以我觉得,做链表题,最重要的就是要掌握:
1、规定好自己的模版,比如我习惯自己弄一个辅助头节点,确定下来之后,就一直这么做,不要变来变去。
2、做的时候,多考虑一步,就是在用 .next 节点的时候,会不会出现异常。
上面这两天是帮助你可以做起题来错误更少,速度更快,除了这两个之外,做链表的题还有非常重要的一个点,那就是:积累解题思路
链表的题型不多,也不难理解,很好积累,所以大家可以多看几道不同类型的题,不然遇到完全陌生的题,那你可能就真的不会的,因为链表的暴力解法都不难。
不过话说回来,在面试中,题型不多,出现最多的还是删除倒数第 K 个节点,反转,交点这一些,思路不难,重在考察代码能力。
所以我觉得,学习链表最大的技巧就是多做几遍。
算法技巧:巧用双指针
对于双指针,在做关于单链表的题是特别有用,比如“判断单链表是否有环”、“如何一次遍历就找到链表中间位置节点”、“单链表中倒数第 k 个节点”等问题。对于这种问题,我们就可以使用双指针了,会方便很多。我顺便说下这三个问题怎么用双指针解决吧。
例如对于第一个问题
我们就可以设置一个慢指针和一个快指针来遍历这个链表。慢指针一次移动一个节点,而快指针一次移动两个节点,如果该链表没有环,则快指针会先遍历完这个表,如果有环,则快指针会在第二次遍历时和慢指针相遇。
对于第二个问题
一样是设置一个快指针和慢指针。慢的一次移动一个节点,而快的两个。在遍历链表的时候,当快指针遍历完成时,慢指针刚好达到中点。
对于第三个问题
设置两个指针,其中一个指针先移动k个节点。之后两个指针以相同速度移动。当那个先移动的指针遍历完成的时候,第二个指针正好处于倒数第k个节点。
你看,采用双指针方便多了吧。所以以后在处理与链表相关的一些问题的时候,可以考虑双指针哦。
也就是说,你掌握了双指针,意味着掌握了大部分常规链表题,当然,双指针不一定就是快慢指针哦,另外就是,双指针另外一个应用的比较多的领域就是:在排序数组在求和,关于这个,后续应该也会有题讲到。
Day1:4道常规题
本次需要解决的算法题有四个(PS:点击链接会直达Leetcode原文链接)
下面简单说一下这几道题:
剑指 Offer 18. 删除链表的节点
难度:★
要求掌握程度:★★★★★
说明:基础题,0 技巧,属于基本功了,自己先试着写一写,如果不会的 ,建议多画个图,多写几遍。
注意点:删除头节点 + 空节点
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/440.html
剑指 Offer 22. 链表中倒数第k个节点
难度:★
要求掌握程度:★★★★★
说明:快慢双指针的运用。
注意点:注意空指针异常
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/442.html
剑指 Offer 25. 合并两个排序的链表
难度:★★
要求掌握程度:★★★★★
说明:本题类似于递归排序算法的 merge 操作,也算是双指针。
注意点:无
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/444.html
剑指 Offer 52. 两个链表的第一个公共节点
难度:★★
要求掌握程度:★★★★★
说明:由于本题是不存在环的,所以相对容易,可以直接遍历计算节点数量之差,也可以采用双指针,不过建议理解双指针的方法,代码优雅。
注意点:无
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/446.html
Day2:3道题
关于栈与递归的选择:单链表只能从前往后遍历,不支持从后往前遍历,所以遇到诸如倒数打印,反转之类的题,我们往往会选择栈来辅助,也可以选择用递归。但是从面试官的解法看,比起栈,递归会更好,因为用栈,那就有点太简单的。
不过无论选择递归还是栈,空间复杂度一样,就是选择递归时,还需要考虑一个递归太深的话,出现内存溢出的情况。
今天的题有三道:
下面是详细说明:
剑指 Offer 06. 从尾到头打印链表
-
难度:★
-
要求掌握程度:★★★★
-
说明:基础题,不建议用栈,最好可以会递归,不会的话,勉强用栈也可以了。
-
描述+答案+代码:https://www.playoffer.cn/479.html
剑指 Offer 24. 反转链表
-
难度:★★
-
要求掌握程度:★★★★★
-
说明:基础题,递归反转+原地反转,两种方法都要掌握
-
描述+答案+代码:https://www.playoffer.cn/481.html
剑指 Offer 35. 复杂链表的复制
-
难度:★★★
-
要求掌握程度:★★
-
说明:这道题考的比较少,主要了解下思路,很容易写错,主要考察代码能力。
-
描述+答案+代码:https://www.playoffer.cn/483.html
专题2:基本数据结构实现
查考分析
面试有时候会让你实现某个数据结构的一些操作,不过一般不会去让你实现一个链表啊,也不会让你去实现一个二叉树啊,但是会经常让你用队列来实现栈,或者用栈来实现队列。
这个其实也不难,主要就是考察你对基本数据结构的理解,比如栈是先进后出,而队列则先进先出,这是两种既相似又相反的数据结构,使得他们经常会被关联在一起。
不过呢,只要理解了,还是比较简单滴,做的也没啥技巧,所以这里也不提供什么算法思想之类的哦,最大的技巧就是自己找两组数组模拟一下。
Day3:2道题,队列与栈的相互转换
两道题如下(PS:点击链接可以直达leetcode原题),其中一道并不是剑指Offer的题勒。
下面是详细说明:
剑指 Offer 09. 用两个栈实现队列
- 难度:★★
-
要求掌握程度:★★★★
-
说明:基本功,没啥好说,
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/508.html
LeetCode 225. 用队列实现栈
-
难度:★★
-
要求掌握程度:★★★★
-
说明:基本功,没啥好说,
-
题解和描述:由于本题不是剑指offer里的,所以没有讲解,大家可以Leetcode评论区找答案哦(原题直达)
Day4:两道题 + 一道面试变形题
今天这两道题,面试考的特别多,特别是最小栈的设计,我当时面试 shopee 时还遇到过变形题,今天的题如下
下面是详细说明
剑指 Offer 30. 包含min函数的栈
- 难度:★★
-
要求掌握程度:★★★★★
-
说明:高频题,两种方法的思路都要掌握,一种是时间高,空间低,一种是空间低,时间高
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/552.html
剑指 Offer 31. 栈的压入、弹出序列
- 难度:★★★
-
要求掌握程度:★★★★
-
说明:没啥好说,也没啥算法思想。
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/554.html
专题3:二叉树
考察分析+需要掌握的算法思想
之前我说过,链表考察频率第一,二叉树则可以是排名第二,并且考察的问题也不会很难,easy + medium 考察的比较多,和链表一样,二叉树多描述也是很简单,描述简单是考察高频的一个原因。
另外一个原因则和链表不同,链表思路简单,考察代码严谨性;而二叉树,则考察你的抽象能力,基本大多数二叉树的问题,都得用递归来处理,不然就是用队列或者栈来辅助(队列居多),而且好多还要你懂回溯的思想,这意味着,你懂二叉树,说明你至少是对一些算法思想了解的,否则你就是一脸懵逼。
下面说一说学习二叉树你需要掌握什么:
1、前中后三种遍历,你得会,怎么着得会递归的解法吧?当然,最好也要会非递归的方法。
2、能够熟悉使用递归去解决问题,部分题还得用回溯,所以这里我也给大家准备了递归 + 回溯 的入门文章。
【递归】关于递归,我总结的解题步骤
【回溯】一文学会回溯算法解题步骤
3、掌握前中后遍历的一些关系:二叉树的问题,有时候会让你去重建一颗二叉树,这个时候你就得明白他们的一些关系了。
会了 1 和 2,你其实可以解决挺多二叉树的问题的,然后二叉树有很多打印的问题,如果你要轻松掌握打印这类问题,那你要去研究二叉树与队列的一些关系,可以说,遇到层序遍历相关,基本就是和队列相关了。
好,下面开始我们来打卡刷题,由于有两篇入门的文章需要大家消化,第一天的题会简单一点哦
Day5:两道算法题+两篇算法思想文章
下面是今天的两道题(PS:点击链接可以直达原题)
剑指 Offer 55 – I. 二叉树的深度
-
难度:★
-
要求掌握程度:★★★★★
-
说明:没啥好说,直接按照我说的递归套路,秒解决
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/614.html
剑指 Offer 55 – II. 平衡二叉树
- 难度:★★
-
要求掌握程度:★★★
-
说明:这里我发现不少人没学过 AVL 树,如果你没学过,这里建议你去学一学,我以前写过对应的文章:漫画:什么是AVL树?
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/616.html
Day6:3道二叉树
学习二叉树的话,得不能陷进去,采取我说的递归三部曲,从总体上去分析,这三道题也是一样,和昨天两道类似,只是昨天两点比较简单,今天这三道,如果你也能够按照我文章的三部曲去分析怎么做,那你关于递归这方面的基本功,就差不多了。
本次三道题具体描述如下
剑指 Offer 27. 二叉树的镜像
- 难度:★★
-
要求掌握程度:★★★★
-
说明:没啥特别说明
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/546.html
剑指 Offer 28. 对称的二叉树
- 难度:★★
-
要求掌握程度:★★★★
-
说明:没啥特别说明
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/548.html
剑指 Offer 26. 树的子结构
- 难度:★★
-
要求掌握程度:★★★
-
说明:没啥特别说明
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/544.html
Day7:3道二叉树(其中一道多次考察)+一道额外要求题
- 额外要求题:请给出前中后三种二叉树遍历的非递归代码
-
多次被考察真题:剑指 Offer 32 – III. 从上到下打印二叉树
本次三道题,都是打印相关,这种层序打印的题,由于无法用递归,基本都得用队列来辅助,面试一般也是考察这种层序打印的题。下面是具体安排
前中后三种二叉树遍历的非递归代码
本题属于基本题,由于递归的代码太简单,一般要求掌握非递归代码,大家去写吧
剑指 Offer 32 – I. 从上到下打印二叉树
- 难度:★★
-
要求掌握程度:★★★★
-
说明:没啥特别说明,就是要掌握一下JDK队列的一些常用方法
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/556.html
剑指 Offer 32 – II. 从上到下打印二叉树
- 难度:★★
-
要求掌握程度:★★★★
-
说明:没啥特别说明
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/558.html
多次被考察真题:剑指 Offer 32 – III. 从上到下打印二叉树
- 难度:★★★
-
要求掌握程度:★★★★
-
说明:没啥特别说明
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/566.html
Day8:2道二叉树
我觉得二叉树有一种题型还是有点难的,就是重构二叉树相关的,比如根据前中遍历构建二叉树啥的,这类型的题,需要你对前中后遍历之间的关系比较熟悉,这也是为啥让大家昨天把前中后遍历先搞懂。
比如对于前序遍历,那么数组的第一个元素就是根节点,对于后序遍历,数组的最后一个元素也是根结点,而对于中序遍历,根节点则把一个数组分成两半,一半是左子树,一半是右子树,也就是说,他们存在某种关系,你需要去找出来。
今天的两道题,都是重建相关的,有一定难度,写的时候也容易出错,大家好好研究一下他们的规律。
剑指 Offer 07. 重建二叉树
-
难度:★★★
-
要求掌握程度:★★★★★
-
说明:根据前中后特性来构建,研究下规律就好了,这道题比较重要。
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/506.html
剑指 Offer 33. 二叉搜索树的后序遍历序列
- 难度:★★★
-
要求掌握程度:★★★
-
说明:要注意二叉树和二叉搜索树的区别。这道题相对不那么重要。
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/568.html
Day9:2道二叉树搜索树
再次强调,要注意题目二叉树和二叉搜索树区别,对于搜索树,一定要注意他们之间的数值关系,今天两道题都是利用数值来查找一些关系滴。
下面是详细说明
剑指 Offer 54. 二叉搜索树的第k大节点
- 难度:★
-
要求掌握程度:★★★
-
说明:基本题
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/612.html
剑指 Offer 68 – I. 二叉搜索树的最近公共祖先
- 难度:★★★
-
要求掌握程度:★★★★★
-
说明:这道题考的挺多,必须掌握,虽然是 easy 题,不过我感觉第一次接触,还是有点难的,通过数值关系来定位
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/643.html
Day10:一道二叉树题
通过上面连续 5 天的二叉树刷题,常规的二叉树题基本覆盖,最后一道题算是综合题,需要你来设计一个序列,把这道题拿下,二叉树基本就差不多了,后面看看能不能找一些真题。
- 剑指 Offer 37. 序列化二叉树
- 下面是详细说明
剑指 Offer 37. 序列化二叉树
- 难度:★★★
-
要求掌握程度:★★★
-
说明:这个类似于一个协议,比如我们加密解密的协议,你可以采取任何方式去处理哦,只要能反向解密就可以了
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/576.html
Day11:额外补充 2 道题
这里我在补充 2 道二叉树的题吧,基本就全了,然后还有最后一道二叉树的题,我把它归类到回溯板块了,大家在做 2 道二叉树的题,如果你面试中遇到二叉树的题,应该 90% 是从咱们这里出的了,补充的题如下(点击链接可以直达原文):
补充的题我没有录制视频哈,大家题解区看答案吧。
两道题第一眼看上去还是有一点难度的,我觉得二叉树这种题,就必须多做几种不同题型,不然在面试的时候,还真不好做。
至于要求掌握力度,都差不多,大概 3~4星吧,具体大家看答案任务。
专题4:二分查找
二分查找意味着数组有序,所以你们在做题的时候,如果看到有序,那么脑子里应该要浮现是否可以采取二分查找这样一种方法,二分查找的题很多,不过我们这个专题,重点是掌握二分查找的一些变种。
我们常规的二分查找,是寻找某个元素 target 的下标(并且该数组没有重复的元素),不过还有四种变形的二分查找(有重复元素
对于这四种题型,大家要去研究一下适合自己的模版,并且记住这个模版,以后做题都不要改动,网上应该有很多模版。
Day12:给出四种变形二分查找的模版
本次打卡的任务很简单,就是给出四种变形二分查找的模版代码,比如对于一个有序数组
arr = [1,2,3,3,3,4,5,5,7],target = 3,那么
1.寻找第一个大于 target 的元素的下标,本案例中4 就是第一个大于 target 的元素 ,下标 = 5。
对应方法名格式为
int upper(int[] arr, int target){
//如果都不存在,则返回-1
}
2.如果数组中存在元素等于 target,则返回最后一个等于target 的元素下标,如果不存在,则返回第一个大于 target 的元素下标。本案例中最后一个等于target的下标 = 4。
对应方法名
int floor_upper(int[] arr, int target){
//如果都不存在,则返回-1
}
3.寻找最后一个小于 target 的元素的下标,本案例中 2 则是最后一个小于 target 的,下标 = 1.
对应方法名格式为
int lower(int[] arr, int target){
//如果都不存在,则返回-1
}
4.如果数组中存在元素等于 target,则返回第一个等于target 的下标,如果不存在,则返回最后一个小于 target 的元素的下标。本案例中第一个等于target的下标 = 2。
对应方法名格式为
int floor_lower(int[] arr, int target){
//如果都不存在,则返回-1
}
答案来了,具体答案看这篇文章:4种二分查找模版讲解
Day 13:2道二分查找题
一般来说,大部分题都不会单纯使用二分查找,都会绕个圈子,今天给大家弄两道二分查找的题,关于上面四个题的模版,我这几天有空在录制给视频给大家讲一讲(点击链接可以直达原题)
下面是详细说明
剑指 Offer 53 – I. 在排序数组中查找
- 难度:★★★
-
要求掌握程度:★★★
-
说明:这个其实就是我们上面四个模版的运用,学过模版的会简单的,没学过的还是有一点小难度。
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/608.html
剑指 Offer 53 – II. 0~n-1中缺失的数字
- 难度:★★★
-
要求掌握程度:★★★★
-
说明:这个其实也类型,不过这道题相对会重要一点点,主要就是掌握方法吧。
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/610.html
Day14:1道二分查找题
这是我们 2 分查找系列的最后一道题,也是一道高频题,做完下个专题就做位运算,这道题还是有点难度
下面是详细说明
剑指 Offer 11. 旋转数组的最小数字
- 难度:★★★★
-
要求掌握程度:★★★★
-
说明:这道题剑指offer标记简单题,其实是一道 hard 题,要用二分查找的思维去做哈,记住二分查找就是不断缩小范围哦。
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/514.html
专题5:位运算
关于位运算,说实话,没啥技巧,靠曾经做过,比如一道题如果你从来没有接触过,那你大概率不晓得还能用位运算来做了,所以对于位运算,那就是多接触几道题。
不过位运算的题也不多,技巧也就那么几个,大家通过这个专题把常见位运算掌握一下就可以了。
阅读材料
之前写过一篇位运算的几个技巧,大家可以先简单接触下,之后做题可能会有思路一下
Day15:2道题
下面是详细说明
剑指 Offer 15. 二进制中1的个数
- 难度:★
-
要求掌握程度:★★★★★
-
说明:常规题,要求技术 n & (n – 1) 这个公式的特点。
问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/524.html
剑指 Offer 16. 数值的整数次方
- 难度:★★
-
要求掌握程度:★★★★
-
说明:常规题
问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/526.html
Day16:2道位运算
剑指 Offer 56 – I. 数组中数字出现的次数
剑指 Offer 56 – II. 数组中数字出现的次数 II
下面是具体说明
剑指 Offer 56 – I. 数组中数字出现的次数
- 难度:★★
-
要求掌握程度:★★★
-
说明:这种题其实没啥技巧,得做过才知道可以用位运算
问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/618.html
剑指 Offer 56 – II. 数组中数字出现的次数 II
- 难度:★★
-
要求掌握程度:★★★
-
说明:这种题也一样其实没啥技巧,得做过才知道可以用位运算
问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/621.html
专题6:数学知识+排序算法+滑动窗口
由于这部分的题都比较少,所以这里把他们合并在一起了,我们先做数学知识相关的题目。这类题一般没有涉及各种算法思想,更多还是通过自己多做才能知道可以这么做,和位运算类似。
所以呢,这类题更多还是考察你做过的题型 + 你的思维联想,一般这种题在考察上也不会很难滴。
Day17:2道数学相关题
剑指 Offer 14- I. 剪绳子
下面是具体说明
剑指 Offer 14- I. 剪绳子
- 难度:★★
-
要求掌握程度:★★★★
-
说明:这道题,好像考研也考过几次,可以通过发现规律来做。
问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/520.html
剑指 Offer 14- II. 剪绳子 II
- 难度:★★★
-
要求掌握程度:★★★
-
说明:这道题的考点就是大数取模,可以记一下方法
问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/522.html
Day18:2道数学相关题
今天两道题也还是挺难的,除非做过,,,所以这种题,还是得做接触,才能想到
下面是具体说明
剑指 Offer 43. 1~n 整数中 1 出现的次数
- 难度:★★★
-
要求掌握程度:★★★
-
说明:找规律题,一般考的不多,不过可以了解下思路
问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/588.html
- 难度:★★★
-
要求掌握程度:★★
-
说明:找规律题,一般考的不多,不过可以了解下思路
问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/590.html
Day19:2 道数学相关题
今天两道题稍微简单一些,不过有时候没做过不容易想到,并且这两道的考察高频一些
下面是具体说明
剑指 Offer 39. 数组中出现次数超过一半的数字
- 难度:★
-
要求掌握程度:★★★★
-
说明:常规题,需要掌握下这种思路
问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/580.html
剑指 Offer 61. 扑克牌中的顺子
- 难度:★
-
要求掌握程度:★★★★
-
说明:常规题,需要掌握下这种思路
问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/635.html
Day20:2道滑动窗口题
滑动窗口的题还挺难的,有时候用栈维护,有时候用队列维护,有时候直接用一个 int 类型的变量维护就可以了
下面是详细说明
剑指 Offer 57 – II. 和为s的连续正数序列
- 难度:★★
-
要求掌握程度:★★★★
-
说明:这道题相对简单,有挺多题用到这种类似的做法
问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/625.html
剑指 Offer 59 – I. 滑动窗口的最大值
- 难度:★★★★
-
要求掌握程度:★★★★
-
说明:这道题有点难,不过面试考的很多
问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/631.html
Day21:2道排序算法相关题
有些题其实可以利用冒泡,归并,快排的方法来做,不过容易被忽略,这里精选了几道给大家练练手
具体描述如下
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
- 难度:★
-
要求掌握程度:★★★★
-
说明:可以用快排的思想,另外还有一个需要注意的,那就是,如果要求调整过程中可以保持稳定性,又该如何呢?
问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/536.html
剑指 Offer 45. 把数组排成最小的数
- 难度:★★★
-
要求掌握程度:★★★
-
说明:也是快排的思想
问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/592.html
Day22:3道算法排序应用相关题
本次三道题有一定难度哦
具体描述如下
剑指 Offer 40. 最小的k个数
- 难度:★★★
-
要求掌握程度:★★★★★
-
说明:快排和堆都要掌握,并且了解他们解法的区别
问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/582.html
剑指 Offer 41. 数据流中的中位数
- 难度:★★★★
-
要求掌握程度:★★★
-
说明:也是优先队列的运用
问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/584.html
剑指 Offer 51. 数组中的逆序对
- 难度:★★★★
-
要求掌握程度:★★★★
-
说明:这道题有点难度,面试问的挺多
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/604.html
专题7:回溯算法
掌握回溯算法非常非常非常重要,一般回溯算法 = 暴力法,基本很多题都可以采用回溯发来做,其实就是深度优先搜索或者广度优先搜索,你掌握了这两个,就等于入门的回溯算法了。
不过在实际做面试题或者笔试时,简单粗糙的回溯算法,往往无法全部 AC,可能会超时,也就是说,大部分回溯发是可以剪枝优化的。
其实回溯的题还是很值得多做几道的,比如组合,排列,等等,但是由于时间有限,毕竟这个是《剑指offer》系列,不能脱离太多,所以帅地无法给大家安排太对回溯相关的题,后续有弄打开,再专题来弄吧。
然后关于回溯算法,有些同学不大懂的,可以学习下图论中的深度优先和广度优先,帅地也给大家找了一些文章来入门:
Day23:2道回溯算法题
今天两道题都稍微简单一些
下面是详细说明
剑指 Offer 12. 矩阵中的路径
- 难度:★★★
-
要求掌握程度:★★★★
-
说明:经典回溯算法题,如果你这道题掌握了,能够自己写出来,说明你回溯算法成功入门了
问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/586.html
剑指 Offer 13. 机器人的运动范围
- 难度:★★★★
-
要求掌握程度:★★★★
-
说明:这道题有点难度,不仅仅需要掌握回溯,还得观察一些规律,不过大家可以先暴力回溯,在考虑优化
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/518.html
Day24:2道回溯算法题
今天两道题有点小难度
下面是详细说明
剑指 Offer 34. 二叉树中和为某一值的路径
- 难度:★★★
-
要求掌握程度:★★★★
-
说明:经典回溯算法题,回了这种二叉树,就会排列了
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/570.html
剑指 Offer 38. 字符串的排列
- 难度:★★★
-
要求掌握程度:★★★
-
说明:排列和组合的题,往往可以拆分成一课多叉树的路径问题,所以没有思路的话可以拆分成一个树来做
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/578.html
专题8:动态规划
动态规划应该是常见算法思想里最难的一个算法了,当时帅地也是懵逼了好久才醒悟,一般在面试的时候,除了字节会经常出动态规划,其他的公司相对会比较少,另外就是笔试的时候也会出动态规划,可以说,掌握了动态规划,说起话来都有底气。
关于动态规划,大家可以按照我这两篇文章的模式来做题:
然后关于动态规划的文章,我们的题会多一些
Day25:2到稍微简单的动态规划题
剑指 Offer 42. 连续子数组的最大和
下面是详细说明
剑指 Offer 42. 连续子数组的最大和
- 难度:★★
-
要求掌握程度:★★★★★
-
说明:可以先用一维数组,之后优化成单个变量
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/586.html
LeetCode 64. 最小路径和
- 难度:★★
-
要求掌握程度:★★★★★
-
说明:二维DP,之后可以通过画图的模式,优化成一维
问题的描述及其答案+代码实现看这里:本地没有录制,自己答案区看勒
Day26:2道中等难度DP
剑指 Offer 63. 股票的最大利润
下面是详细说明
剑指 Offer 63. 股票的最大利润
- 难度:★★★
-
要求掌握程度:★★★★★
-
说明:经典问题,有好几种题型,大家做完,也可以leetcode找下类似题型
问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/639.html
剑指 Offer 47. 礼物的最大价值
- 难度:★★
-
要求掌握程度:★★★★
-
说明:经典问题,先二维,在优化成一维
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/596.html
Day27:一道中等+一道困难DP
剑指 Offer 48. 最长不含重复字符的子字符串
剑指 Offer 48. 最长不含重复字符的子字符串
- 难度:★★★
-
要求掌握程度:★★★★
-
说明:经典问题,90%字符串相关问题,都可以用DP。
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/598.html
剑指 Offer 19. 正则表达式匹配
- 难度:★★★★★
-
要求掌握程度:★★★
-
说明:难度系数比较大的问题,大家可以先试着用递归做
问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/532.html
Day28:3道DP
剑指 Offer 49. 丑数
剑指 Offer 49. 丑数
- 难度:★★★
-
要求掌握程度:★★★
-
说明:这种有点想规律,一般很难想到用DP的,只能说需要多积累
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/600.html
剑指 Offer 60. n个骰子的点数
- 难度:★★★
-
要求掌握程度:★★★
-
说明:这种说实话,也很难想到用DP,,,,
问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/633.html
LeetCode 42. 接雨水
- 难度:★★★★
-
要求掌握程度:★★★★
-
说明:难度系数比较大的问题,也是面试考的非常多的题。
问题的描述及其答案+代码实现看这里:详解一道高频面试题:接雨水
对应打卡问题:【动态规划专题】LeetCode 42. 接雨水
Day29:4道额外DP精选
dp的有些题还挺难的,这里我在精选 4 道动态规划的题,这也是动态规划的最后一天了,之后就在打卡 2 天,就基本结束了。
不过这些题不在剑指offer范围内,所以都是没有录制视频讲解哦,大家可以去题解看答案
LeetCode 198. 打家劫舍
- 难度:★★
-
要求掌握程度:★★★★
-
说明:这道题还有变形的,不过面试一般就考这个,也不算难。
LeetCode 322. 零钱兑换
-
难度:★★★
-
要求掌握程度:★★★★
-
说明:这道题也有好几道变形的,不过大家也是主要掌握常规的
LeetCode 174. 地下城游戏
-
难度:★★★★
-
要求掌握程度:★★★
-
说明:这道题还挺难的,我之前面试被问过两次,好像字节会问的多一些,其他问的不多
LeetCode 72. 编辑距离
- 难度:★★★★
- 要求掌握程度:★★★
- 说明:这道题也挺难,容易出现类似的题在笔试的,就是这种算法也有很多实用的地方。
Day30:杂题(最后一天)
本次都是一些比较简单的杂题,大家可以当作练习熟练度,讲道理是应该放在前面的,不过最后被划分到了最后,主要一开始我觉得,可能你们上面那些题会了,这些题也会,不过又担心大家真的遇到了,无法给出最优解,所以还是给出来,这里就不详细标注了,都是高频题+常规题,难度系数在一星和二星之间。
Offer 10- I. 斐波那契数列
- 难度:★
- 要求掌握程度:★★★★★
- 说明:经典题,没啥好说,很多时候作为DP,递归等入门来讲
- 问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/510.html。
剑指 Offer 10- II. 青蛙跳台阶问题
- 难度:★
- 要求掌握程度:★★★★★
- 说明:经典题,没啥好说
- 问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/512.html。
剑指 Offer 62. 圆圈中最后剩下的数字
- 难度:★★★
- 要求掌握程度:★★★★
- 说明:经典题,需要掌握链表做法+递归做法
- 问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/637.html。
剑指 Offer 03. 数组中重复的数字
- 难度:★★
- 要求掌握程度:★★★★
- 说明:常规题,没啥好说,需要掌握最优解
- 问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/497.html。
剑指 Offer 04. 二维数组中的查找
- 难度:★
- 要求掌握程度:★★★
- 说明:常规题
- 问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/500.html。
剑指 Offer 29. 顺时针打印矩阵
- 难度:★★★
- 要求掌握程度:★★★★
- 说明:第一次做有点难度,要学会从宏观上去掌握,就是定义方向啥的,这个很重要
- 问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/550.html。