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 – 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. 序列化二叉树

  • 难度:★★★

  • 要求掌握程度:★★★

  • 说明:这个类似于一个协议,比如我们加密解密的协议,你可以采取任何方式去处理哦,只要能反向解密就可以了

问题的描述及其答案+代码实现看这里: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- II. 剪绳子 II

下面是具体说明

剑指 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 出现的次数

剑指 Offer 44. 数字序列中某一位的数字

下面是具体说明

剑指 Offer 43. 1~n 整数中 1 出现的次数

  • 难度:★★★

  • 要求掌握程度:★★★

  • 说明:找规律题,一般考的不多,不过可以了解下思路

问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/588.html

  • 难度:★★★

  • 要求掌握程度:★★

  • 说明:找规律题,一般考的不多,不过可以了解下思路

问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/590.html

Day19:2 道数学相关题


今天两道题稍微简单一些,不过有时候没做过不容易想到,并且这两道的考察高频一些

剑指 Offer 39. 数组中出现次数超过一半的数字

剑指 Offer 61. 扑克牌中的顺子

下面是具体说明

剑指 Offer 39. 数组中出现次数超过一半的数字

  • 难度:★

  • 要求掌握程度:★★★★

  • 说明:常规题,需要掌握下这种思路

问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/580.html

剑指 Offer 61. 扑克牌中的顺子

  • 难度:★

  • 要求掌握程度:★★★★

  • 说明:常规题,需要掌握下这种思路

问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/635.html

Day20:2道滑动窗口题


滑动窗口的题还挺难的,有时候用栈维护,有时候用队列维护,有时候直接用一个 int 类型的变量维护就可以了

剑指 Offer 57 – II. 和为s的连续正数序列

剑指 Offer 59 – I. 滑动窗口的最大值

下面是详细说明

剑指 Offer 57 – II. 和为s的连续正数序列

  • 难度:★★

  • 要求掌握程度:★★★★

  • 说明:这道题相对简单,有挺多题用到这种类似的做法

问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/625.html

剑指 Offer 59 – I. 滑动窗口的最大值

  • 难度:★★★★

  • 要求掌握程度:★★★★

  • 说明:这道题有点难,不过面试考的很多

问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/631.html

Day21:2道排序算法相关题


有些题其实可以利用冒泡,归并,快排的方法来做,不过容易被忽略,这里精选了几道给大家练练手

剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

剑指 Offer 45. 把数组排成最小的数

具体描述如下

剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

  • 难度:★

  • 要求掌握程度:★★★★

  • 说明:可以用快排的思想,另外还有一个需要注意的,那就是,如果要求调整过程中可以保持稳定性,又该如何呢?

问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/536.html

剑指 Offer 45. 把数组排成最小的数

  • 难度:★★★

  • 要求掌握程度:★★★

  • 说明:也是快排的思想

问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/592.html

Day22:3道算法排序应用相关题


本次三道题有一定难度哦

剑指 Offer 40. 最小的k个数

剑指 Offer 41. 数据流中的中位数

剑指 Offer 51. 数组中的逆序对

具体描述如下

剑指 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. 矩阵中的路径

剑指 Offer 13. 机器人的运动范围

下面是详细说明

剑指 Offer 12. 矩阵中的路径

  • 难度:★★★

  • 要求掌握程度:★★★★

  • 说明:经典回溯算法题,如果你这道题掌握了,能够自己写出来,说明你回溯算法成功入门了

问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/586.html

剑指 Offer 13. 机器人的运动范围

  • 难度:★★★★

  • 要求掌握程度:★★★★

  • 说明:这道题有点难度,不仅仅需要掌握回溯,还得观察一些规律,不过大家可以先暴力回溯,在考虑优化

问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/518.html

Day24:2道回溯算法题


今天两道题有点小难度

剑指 Offer 34. 二叉树中和为某一值的路径

剑指 Offer 38. 字符串的排列

下面是详细说明

剑指 Offer 34. 二叉树中和为某一值的路径

  • 难度:★★★

  • 要求掌握程度:★★★★

  • 说明:经典回溯算法题,回了这种二叉树,就会排列了

问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/570.html

剑指 Offer 38. 字符串的排列

  • 难度:★★★

  • 要求掌握程度:★★★

  • 说明:排列和组合的题,往往可以拆分成一课多叉树的路径问题,所以没有思路的话可以拆分成一个树来做

问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/578.html

专题8:动态规划


动态规划应该是常见算法思想里最难的一个算法了,当时帅地也是懵逼了好久才醒悟,一般在面试的时候,除了字节会经常出动态规划,其他的公司相对会比较少,另外就是笔试的时候也会出动态规划,可以说,掌握了动态规划,说起话来都有底气。

关于动态规划,大家可以按照我这两篇文章的模式来做题:

【动态规划】关于动态规划,我总结的解题步骤

【动态规划】关于动态规划优化,其实不难

然后关于动态规划的文章,我们的题会多一些

Day25:2到稍微简单的动态规划题


剑指 Offer 42. 连续子数组的最大和

LeetCode 64. 最小路径和

下面是详细说明

剑指 Offer 42. 连续子数组的最大和

  • 难度:★★

  • 要求掌握程度:★★★★★

  • 说明:可以先用一维数组,之后优化成单个变量

问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/586.html

LeetCode 64. 最小路径和

  • 难度:★★

  • 要求掌握程度:★★★★★

  • 说明:二维DP,之后可以通过画图的模式,优化成一维

问题的描述及其答案+代码实现看这里:本地没有录制,自己答案区看勒

Day26:2道中等难度DP


剑指 Offer 63. 股票的最大利润

剑指 Offer 47. 礼物的最大价值

下面是详细说明

剑指 Offer 63. 股票的最大利润

  • 难度:★★★

  • 要求掌握程度:★★★★★

  • 说明:经典问题,有好几种题型,大家做完,也可以leetcode找下类似题型

问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/639.html

剑指 Offer 47. 礼物的最大价值

  • 难度:★★

  • 要求掌握程度:★★★★

  • 说明:经典问题,先二维,在优化成一维

问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/596.html

Day27:一道中等+一道困难DP


剑指 Offer 48. 最长不含重复字符的子字符串

剑指 Offer 19. 正则表达式匹配

剑指 Offer 48. 最长不含重复字符的子字符串

  • 难度:★★★

  • 要求掌握程度:★★★★

  • 说明:经典问题,90%字符串相关问题,都可以用DP。

问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/598.html

剑指 Offer 19. 正则表达式匹配

  • 难度:★★★★★

  • 要求掌握程度:★★★

  • 说明:难度系数比较大的问题,大家可以先试着用递归做

问题的描述及其答案+代码实现看这里: https://www.playoffer.cn/532.html

Day28:3道DP


剑指 Offer 49. 丑数

剑指 Offer 60. n个骰子的点数

LeetCode 42. 接雨水

剑指 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 天,就基本结束了。

LeetCode 198. 打家劫舍

LeetCode 322. 零钱兑换

LeetCode 174. 地下城游戏

LeetCode 72. 编辑距离

不过这些题不在剑指offer范围内,所以都是没有录制视频讲解哦,大家可以去题解看答案

LeetCode 198. 打家劫舍

  • 难度:★★

  • 要求掌握程度:★★★★

  • 说明:这道题还有变形的,不过面试一般就考这个,也不算难。

LeetCode 322. 零钱兑换

  • 难度:★★★

  • 要求掌握程度:★★★★

  • 说明:这道题也有好几道变形的,不过大家也是主要掌握常规的

LeetCode 174. 地下城游戏

  • 难度:★★★★

  • 要求掌握程度:★★★

  • 说明:这道题还挺难的,我之前面试被问过两次,好像字节会问的多一些,其他问的不多

LeetCode 72. 编辑距离

  • 难度:★★★★
  • 要求掌握程度:★★★
  • 说明:这道题也挺难,容易出现类似的题在笔试的,就是这种算法也有很多实用的地方。

Day30:杂题(最后一天)


本次都是一些比较简单的杂题,大家可以当作练习熟练度,讲道理是应该放在前面的,不过最后被划分到了最后,主要一开始我觉得,可能你们上面那些题会了,这些题也会,不过又担心大家真的遇到了,无法给出最优解,所以还是给出来,这里就不详细标注了,都是高频题+常规题,难度系数在一星和二星之间。

剑指 Offer 10- I. 斐波那契数列

剑指 Offer 10- II. 青蛙跳台阶问题

剑指 Offer 62. 圆圈中最后剩下的数字

剑指 Offer 03. 数组中重复的数字

剑指 Offer 04. 二维数组中的查找

剑指 Offer 29. 顺时针打印矩阵

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. 二维数组中的查找

剑指 Offer 29. 顺时针打印矩阵

  • 难度:★★★
  • 要求掌握程度:★★★★
  • 说明:第一次做有点难度,要学会从宏观上去掌握,就是定义方向啥的,这个很重要
  • 问题的描述及其答案+代码实现看这里:https://www.playoffer.cn/550.html。

发表回复

后才能评论