![](https://img-blog.csdnimg.cn/direct/9a6d39850991434ab4967230dcdd99f0.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
面试必刷TOP101
文章平均质量分 94
牛客网的面试必刷101习题。自己做一遍,做完之后写一下做题感悟同时记录一下思路和题解
澄澈i
尽吾志也而不能至者,可以无悔矣。
变强总是让人抓耳挠腮,头顶着凉。
展开
-
C/C++ BM35 判断是不是完全二叉树
明白完全二叉树的定义之后,根据特性来进行遍历即可。难的地方在于DFS和BFS吧二叉树的常规解法是递归,但这里递归我一开始也尝试过,只能处理同一条分支的情况,无法比较左右两侧。二叉树的遍历通常使用层次遍历或者深搜遍历。原创 2024-07-14 17:43:28 · 902 阅读 · 0 评论 -
C/C++ BM30 二叉搜索树与双向链表
这道题要明白二叉搜索树的概念,同时还要对链表的知识比较熟悉。回顾了一下中序遍历,对二叉搜索树的理解更进一步。原创 2024-05-03 14:23:51 · 1006 阅读 · 0 评论 -
C/C++ BM34 判断是不是二叉搜索树
上一题弄明白二叉搜索树的概念,这题做起来就相对简单一些了。二叉搜索树:中序遍历。二叉树:递归或者栈。原创 2024-05-03 14:23:40 · 829 阅读 · 0 评论 -
C/C++ BM33 二叉树的镜像
镜像说的好听,无非就是换下节点。主要还是用递归来做。看了下官方的题解,还有个是栈的,感觉差不多,这里就没贴了。思路都是一样的。原创 2024-05-02 13:58:02 · 929 阅读 · 0 评论 -
C/C++ BM32 合并二叉树
树的题目大概率是要用到递归的,将一个树的问题拆分成子树的问题,不断拆分。这题也用到了递归的思想。树相关的东西,几种遍历方式要烂熟于心。还有就是递归一般都是优先解法。原创 2024-05-02 13:57:22 · 1125 阅读 · 0 评论 -
C/C++ BM28 二叉树的最大深度
这个最大深度就是DFS搜索的概念了,每个路径都搜索,看一下那条路径最长。最长的路径就是最大深度了。树的遍历加上递归的使用,将问题进行拆分,是二叉树的一种精髓了。原创 2024-04-20 17:22:44 · 603 阅读 · 0 评论 -
C/C++ BM25二叉树的后序遍历
和前序遍历中序遍历一致,换个顺序就行。详情参考C/C++ BM23 二叉树的前序遍历详情参考C/C++ BM24 二叉树的中序遍历明白了前序和中序遍历,这个后序遍历也非常简单。原创 2024-04-14 14:01:05 · 1142 阅读 · 0 评论 -
C/C++ BM24二叉树的中序遍历
中序遍历和前序遍历的不同地方简单改过就是根的位置不同罢了。具体参考C/C++ BM23 二叉树的前序遍历明白了前序遍历,这个中序遍历无非就是换个顺序的问题。原创 2024-04-14 13:59:59 · 775 阅读 · 0 评论 -
C/C++ BM23 二叉树的前序遍历
自己在草稿纸上模拟这个遍历的过程比较简单,但是转移到代码上就突然会懵逼。这个在我之前学数据结构,做到这个实验的时候觉得很难理解。最近虽然已经入职了,但是刷刷题巩固一下基础的时候,还是会受益良多。数据结构的东西有时候比较抽象,算法思想到代码的转换需要自己好好琢磨。之前做算法题的时候,觉得很奇怪,为什么讲算法原理,明白了,但是具体上手题目的时候,就是一脸懵逼,告诉你怎么写了,还是不会写。究其本质就是写到少,想的少;事必躬亲可能才是唯一解吧。原创 2024-04-14 13:59:37 · 850 阅读 · 0 评论 -
C/C++ BM21 旋转数组的最小数字
查找算法的适用条件以及找到题目最核心的诉求是解决问题的关键。遇到有序数列的一种查找,如果对时间复杂度有要求,要考虑二分查找。原创 2024-04-14 14:01:34 · 871 阅读 · 0 评论 -
C/C++ BM20 数组中的逆序对
除了最常规的暴力破解,还要根据题意考虑更优质解答。最近整理了一下各种排序的算法,暂时还没整理到归并排序,所以这里第一优化的反应是考虑用二分查找的方式,但是二分查找一般涉及到有序的数列。这里还是不符合。这里我们想要的是一种分治的思想,所以归并排序会更好。原创 2024-03-10 14:40:31 · 824 阅读 · 0 评论 -
C/C++ BM19 寻找峰值
这道题第一遍做的时候题目条件没有好好的审阅,导致在判断边界问题的时候出了不少岔子。我的方法是时间复杂度为O(N)的,官方的logN可能更好一些。我的就是简单的遍历判断求解,官方用的是二分查找的方式。多画一画图,注意边界。同时要看清题目意思,看懂每个条件。原创 2024-03-10 14:40:01 · 1097 阅读 · 0 评论 -
C/C++ BM18 二维数组中的查找
这道题主要是题目要求的时间复杂度和空间复杂度怎么处理,最简单的暴力那就是全部遍历一遍,虽然也能过,但是不符合题意。查找题要看清题目给的,除了常见的二分,用暴力有时候也可以,更多的还要考虑题目的特殊性。原创 2024-02-24 11:27:13 · 981 阅读 · 0 评论 -
C/C++ BM17 二分查找-I
一篇简单的二分查找的运用简单回顾一下二分查找,注意二分查找的对象,一般是有序数列。原创 2024-02-24 11:26:53 · 863 阅读 · 0 评论 -
C/C++ BM16 删除有序链表中重复的元素-II
这道题和BM15稍有些差别,一开始做的时候还是按照BM15的方法来做,结果想了半天发现自己路走窄了。这道题也是删除节点的方式,不过可能出现删除或者说跳过节点数不固定的情况,这种情况在处理的时候,我一开始用一个变量来保存要处理的节点个数,最后发现,这样做很麻烦,要考虑多种情况。BM15与BM16属于同类型问题,BM16是进阶。这类问题主要在于删除节点的操作,链表中删除节点涉及到当前节点的删除和下一个节点的删除大致这两种情况。原创 2024-02-23 09:44:53 · 1194 阅读 · 0 评论 -
C/C++ BM15 删除有序链表中重复的元素-I
这题比较简单,就是一个链表中的删除节点操作以及节点值比较的过程。主要是对链表的删除操作的复习回顾。原创 2024-02-23 09:44:41 · 904 阅读 · 0 评论 -
C/C++ BM14 链表的奇偶重排
这道题算是链表思路的一种常规题,看透题目本质做起来还是不难。链表做题两种方式,双指针,开辟辅助数组或链表。原创 2024-02-21 09:16:40 · 1110 阅读 · 0 评论 -
C/C++ BM13 判断一个链表是否为回文结构
回文结构这种之前在做C++入门题的时候,判断回文数的时候遇到过。之前的做法是采用取数,求余等方法来把每一个数取出来再组合进行判断。在链表中,链表倒置后再相互判断值,比原本取数的方法好像更方便。官方给的理解还是用了双指针法,我这里也会贴。这题比较简单,方法也有很多,个人觉得在链表题中,链表翻转和双指针法的用途还是比较广的。原创 2024-02-21 09:16:27 · 906 阅读 · 0 评论 -
C/C++ BM12 单链表的排序
链表排序处理起来比较麻烦,因为它不支持下标操作。这里写一下链表排序的常用方法。链表排序除了用辅助数组,还可以用归并的思想。关于归并排序在链表中的运用还是有点陌生,需要多实践。原创 2024-02-20 12:12:15 · 1024 阅读 · 0 评论 -
C/C++ BM11 链表相加(二)
这道题使用链表来实现加法运算,主要是涉及到数据对位以及加法进位的处理。这道题回顾了一下链表翻转。对于链表的四则运算涉及到对位情况,考虑使用翻转链表会更好。不能按照常规的四则运算从左到右的顺序来做,要结合链表本身的特性来做。原创 2024-02-20 12:11:54 · 894 阅读 · 0 评论 -
C/C++ BM6判断链表中是否有环
做了一堆单链表单指针的题目,这次是个双指针题,这里双指针的作用非常明显。如何判断链表有环的情况,之前没遇到过。所以第一次做的时候有点懵逼,同时对双指针的使用上并不是特别熟悉,这道题在初期思考的时候都是想着怎么用单链表加标志位的情况来判断。还是有点草率了。原创 2024-01-18 21:11:05 · 1076 阅读 · 0 评论 -
C/C++ BM4 合并两个排序的链表
这道题采用两种方式,一种是直接插入法,还有一种就是递归调用。合并链表的过程就是插入节点的过程,不过是双链表遍历。首先判断两个链表的最小节点谁的最小,那么链表首节点小的作为基链表,另一个链表进行比较与插入。一般链表题都要添加一个头结点,作为哨兵节点,这样的好处是确保每一个节点都有一个前置节点。对于题目中的特殊情况,空链表这种,我们得单独拎出来判断。如果一个链表是空链表,则直接返回另一个非空链表;如果两个链表都为空,则直接返回空链表。原创 2023-12-30 20:30:23 · 1028 阅读 · 0 评论 -
C/C++ BM2链表内指定区间反转
这题是BM1的升级版,不过是把完整的链表翻转变成了指定区间。这道题是结合了BM1的链表翻转,并增添了遍历指定位置节点、链表断表、插入、组合等操作。难度比上一题BM1加大,核心思想不变,依旧是倒置链表。原创 2023-12-25 23:12:14 · 1174 阅读 · 0 评论 -
C/C++ BM1反转链表
给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n)。经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。数据范围: 0≤n≤10000≤n≤1000。如当输入链表{1,2,3}时,原创 2023-12-20 22:17:47 · 1473 阅读 · 0 评论 -
C/C++ BM5 合并K个已排序的链表
在接触了BM4的两个链表合并的情况,对于k个已排序列表,其实可以用合并的方法来看待问题。这道题是BM4的延伸,主要是多了一个两两合并的思想;对于解法二,就是有点取巧的意思了,就题论题这种。原创 2024-01-18 21:10:44 · 956 阅读 · 0 评论 -
C/C++ BM7 链表中环的入口结点
BM6里面使用了双指针法和哈希的方式来查找环,BM7相对于BM6只多了一个查找第一个重复地址的过程。个人认为是用哈希是最简单,C++11标准的set或者map。这道题让我对STL中的set特性有了更深的理解;结合BM6和BM7,两道题让我第一次接触双指针解法,收获颇丰。原创 2024-02-18 15:58:27 · 955 阅读 · 0 评论 -
C/C++ BM10 两个链表的第一个公共结点
这道题用到的思想和前几道题一样,涉及到了双指针这种,整体难度不大。链表题常用算法,双指针。两个链表之间的关系比较,考虑STL容器。原创 2024-02-19 16:59:12 · 912 阅读 · 0 评论 -
C/C++ BM3 链表中的节点每k个一组翻转
这道题的关键是理解链表指针的位置;在BM2的区间翻转基础上,多了个指针偏移,博客里面我贴图阐述一下。BM3应该是链表翻转的最终题了。从BM1的翻转链表,到BM2的区间翻转,再到BM3的分段区间翻转。确实让我对链表有了更深刻的理解。链表中的断链和接链的操作要注意顺序,在插入节点的时候比较重要。插入节点的时候要先把节点指向新链表,再断链表相连。链表确定数据长度需要使用while循环来依次遍历,并使用一个int类型的变量进行计数。原创 2023-12-30 20:29:55 · 1105 阅读 · 0 评论 -
C/C++ BM8 链表中倒数最后k个结点
这道题和BM1中的思路有些许类似,整体不难。这题比较简单,主要就是链表遍历,同时也复习了一下栈的使用。原创 2024-02-18 15:58:41 · 851 阅读 · 0 评论 -
C/C++ BM9 删除链表的倒数第n个节点
这道题对于BM8来讲,其实是一个新的解题思路。主要用到了双指针以及哨兵节点。BM8,9综合了前面做到的题的思路。链表题几个思路:双链表,栈,遍历。原创 2024-02-19 16:58:57 · 882 阅读 · 0 评论