自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(472)
  • 收藏
  • 关注

原创 112. 路径总和

类型表示,在回归的过程中,上层节点就可以继续往上回归告知再上一层节点,从我这里过的话存在满足条件的路径,知道一直回归告知给根节点,便可以知道整棵树存在满足条件的路径了。了,右子树都不用去递归了,但是不是发现精简之后的代码,已经完全看不出分析的过程了,所以我们要把题目分析清楚之后,再追求代码精简。图中可以看出,遍历的路线,并不要遍历整棵树,且需要上层节点能感知到经过自身节点的路径到达叶子节点后是否存在符合条件的路径,所以递归函数需要返回值,可以用。了,说明当前的路径符合要求,我们当前路径加入到。

2024-09-26 01:23:21 189

原创 513. 找树左下角的值

递归求深度的写法,每进入一层,深度+1。递归中其实隐藏了回溯,上面递归代码时,故意让左右子树写法不同,左子树明确回溯,右子树隐藏了回溯。层次遍历本题涉及到的点,我们之前都讲解过,这些知识点需要同学们灵活运用,这样就举一反三了。

2024-09-25 23:42:06 504

原创 404. 左叶子之和

这道题目要求左叶子之和,其实是比较绕的,因为不能判断本节点是不是左叶子节点。此时就要通过节点的父节点来判断其左孩子是不是左叶子了。平时我们解二叉树的题目时,已经习惯了通过节点的左右孩子判断本节点的属性,而本题我们要通过节点的父节点判断本节点的属性。希望通过这道题目,可以扩展大家对二叉树的解题思路。

2024-09-25 23:05:53 365

原创 257. 二叉树的所有路径(回溯详解)

综合以上,第二种递归的代码虽然精简但把很多重要的点隐藏在了代码细节里,第一种递归写法虽然代码多一些,但是把每一个逻辑处理都完整的展现出来了。来记录路径,注意在下面处理单层递归逻辑的时候,要做回溯,可能有的同学问了,我看有些人的代码也没有回溯啊。这道题目要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。我们先使用递归的方式,来做前序遍历。,这么写的话相当于把递归和回溯拆开了, 一个在花括号里,一个在花括号外。这个回溯就有很大的问题,我们知道,回溯和递归是一一对应的,

2024-09-22 23:12:31 1070

原创 110. 平衡二叉树

那是因为代码的逻辑其实是求的根节点的高度,而根节点的高度就是这棵树的最大深度,所以才可以使用后序遍历。如果是求某个中间节点的深度,则使用后序遍历可能会算错,比如上图中节点4的深度是3,如果按后序遍历求高度来算,会得到深度是2(但深度实际是3,高度才是2)可以看出使用了前序(中左右)的遍历顺序,这才是真正求深度的逻辑!中求的是二叉树的最大深度,也用的是后序遍历。是指该树所有节点的左右子树的深度相差不超过。的题目中都是以节点为一度,即根节点深度是。中,如果真正求取二叉树的最大深度,,不同的地方有不一样的标准,

2024-09-22 22:22:10 930

原创 222. 完全二叉树的节点个数

网上基本都是这个精简的代码版本,其实不建议大家照着这个来写,代码确实精简,但隐藏了一些内容,连遍历的顺序都看不出来,所以初学者建议学习版本一的代码,稳稳的打基础。的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。代码如下: 有没有看到青蛙跳台阶问题的影子,思想几乎一模一样好吧!:遍历树来统计节点是一种时间复杂度为。给你一棵 完全二叉树 的根节点。,算上了递归系统栈占用的空间。,求出该树的节点个数。,统计节点数量就可以了。

2024-09-22 21:37:03 632

原创 111. 二叉树的最小深度

那么使用后序遍历,其实求的是根节点到叶子节点的最小距离,就是求高度的过程,不过这个最小距离 也同样是最小深度。以下讲解中,遍历顺序上依然采用后序遍历(因为要比较递归返回之后的结果,本文我也会给出前序遍历的写法)。,本题还可以使用层序遍历的方式来解决,思路是一样的。什么是叶子节点,左右孩子都为空的节点才是叶子节点!直觉上好像和求最大深度差不多,其实还是差不少的。如果左子树为空,右子树不为空,说明最小深度是。反之,右子树为空,左子树不为空,最小深度是。说明:叶子节点是指没有子节点的节点。1 + 左子树的深度。

2024-09-22 19:44:33 490

原创 104. 二叉树的最大深度(包括N叉树的最大深度)

本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。使用迭代法的话,使用层序遍历是最为合适的,因为最大的深度就是二叉树的层数,和层序遍历的方式极其吻合。而根节点的高度就是二叉树的最大深度,所以本题中我们通过后序求得根节点高度来求的二叉树最大深度。所以这道题的迭代法就是一道模板题,可以使用二叉树层序遍历的模板来解决的。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。是指从根节点到最远叶子节点的最长路径上的节点数。叉树,找到其最大深度。

2024-09-22 18:57:35 483

原创 101. 对称二叉树(共含三道leetcode题)

对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了其实我们要比较的是两个树(这两个树是根节点的左右子树),所以在递归遍历的过程中,也是要同时遍历两棵树。在迭代法中我们使用了队列,需要注意的是这不是层序遍历,而且仅仅通过一个容器来成对的存放我们要比较的元素,知道这一本质之后就发现,用队列,用栈,甚至用数组,都是可以的。细心的话,其实可以发现,这个迭代法,其实是把左右两个子树要比较的元素顺序放进一个容器,然后成对成对的取出来进行比较,那么其实使用栈也是可以的。

2024-09-22 16:25:46 895

原创 N叉树的前序与后续遍历(含两道leetcode题)

在前序遍历中,我们会先遍历节点本身,然后从左向右依次先序遍历该每个以子节点为根的子树,而在后序遍历中,需要先从左到右依次遍历每个以子节点为根的子树,然后再访问根节点。此时我们可以利用前序遍历,只不过前序遍历中对子节点的遍历顺序是从左向右,而这里是从右向左。)出现在栈顶的位置。在遍历结束之后,我们把遍历结果进行反转,就可以得到后序遍历。,这样就保证了出栈顺序是从右向左,下一个遍历到的节点(即。叉树的前序遍历相同的方法,使用一个栈来得到后序遍历。为根节点的子树的遍历结果(不包括。,它的从左至右子节点依次为。

2024-09-22 13:25:55 1000

原创 226. 翻转二叉树之多种解法(递归法、深度优先(迭代法)、广度优先【层序遍历】)

针对二叉树的问题,解题之前一定要想清楚究竟是前中后序遍历,还是层序遍历。二叉树解题的大忌就是自己稀里糊涂的过了(因为这道题相对简单),但是也不知道自己是怎么遍历的。这也是造成了二叉树的题目“一看就会,一写就废”的原因。针对翻转二叉树,我给出递归法、深度优先(迭代法)、广度优先【层序遍历】多种解法,都是之前我们讲过的写法,融汇贯通一下而已。大家一定也有自己的解法,但一定要成方法论,这样才能通用,才能举一反三!

2024-09-22 12:18:49 1035

原创 中序遍历二叉树全过程图解

再次回顾一下代码从我们的遍历全流程图解来看,不难理解,每个节点都是将其左子树全部递归遍历完后,才开始遍历其右子树的,如根节点A,是将其左子树BDE全部遍历完后,才开始遍历右子树的,注意思考递归栈哦,这样才能真正的理解。中序遍历理解后,前序和后续遍历是一样的道理。这时一起看下后续遍历很多同学看到递归左右子树的那两行代码,很容易陷入误区,以为那两行是"同时"在执行,认为遍历完root的左节点后,立马遍历了其右节点,这种理解是非常不对的,实际是遍历完整个左子树后,经过归回到当前层,此时才会开始执行当前层的。

2024-09-21 19:16:45 1617

原创 什么是递归

递归就像我们查字典的时候,当查找一个词时,发现它的解释中某个词仍然不懂,于是开始查这第二个词。就像在字典中一直查找不明白的词语 的情况。函数的调用,所以这个函数就是递归函数,一词不懂,于是开始查找千钧的意思。层时有多少种跳法,可以看作求解问题。到此我们就彻底明白了千钧一发的意思。自上而下的思考,也就是说如果要跳到。的问题解决了,无法继续往下递了。级台阶的跳法,那么从以上分析可得。这个词还是不懂,于是继续查找。仔细看题目,一只青蛙一次只能跳。级台阶有两种跳法,每次跳。函数我们简写下,改为。

2024-09-21 14:05:49 799

原创 通过两道题深入理解二叉树递归

输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。如果当前节点不是叶节点,则继续访问他的子节点。题中所指的路径是从根节点出发到叶节点,也就是说路径总是以根节点为起始点,以叶子节点为终点,因此我们。纵观树的前、中、后序三种遍历方式中,只有前序遍历是首先访问根节点的,所以我们应选择。当用前序遍历的方式访问到某一节点时,我们把该节点添加到路径。给定一个二叉树,返回所有从根节点到叶子节点的路径。的值,如果该节点是叶子节点,且。

2024-09-20 22:42:52 580

原创 二叉树的层序遍历(含八道leetcode相关题目)

如图所示:将每层的元素从左至右加入队列,取出时就会先取出左节点,并将当前节点的左右节点又加入队尾,接着从队列取出下一个元素,将它的左右节点同样加入队尾,以此类推。那怎么确认取出多少个元素的时候可认为当前层的元素都取完了呢?这就需要一个变量来记录啦,这个变量其实就是每轮循环开始时队列的长度,当前长度就是当前层的所有元素,该轮循环的后续操作就是将下一层的所有节点加入队尾。层序遍历一个二叉树。这种遍历的方式和我们之前讲过的都不太一样。代码如下:这份代码也可以作为二叉树层序遍历的模板,打十个就靠它了。

2024-09-19 00:12:16 386

原创 二叉树的前中后序遍历(迭代法)( 含leetcode上三道【前中后序】遍历题目)

此时我们用迭代法写出了二叉树的前后中序遍历,大家可以看出前序和中序是完全两种代码风格,并不像递归写法那样代码稍做调整,就可以实现前后中序。这是因为前序遍历中访问节点(遍历节点)和处理节点(将元素放进res数组中)可以同步处理,但是中序就无法做到同步!上面这句话,可能一些同学不太理解,建议自己亲手用迭代法,先写出来前序,再试试能不能写出中序,就能理解了。

2024-09-18 23:17:31 920

原创 二叉树的前中后序遍历(递归法)( 含leetcode上三道【前中后序】遍历题目)

这次我们要好好谈一谈递归,为什么很多同学看递归算法都是“一看就会,一写就废”。主要是对递归不成体系,没有方法论,每次写递归算法 ,都是靠玄学来写代码,代码能不能编过都靠运气。本篇将介绍前后中序的递归写法,一些同学可能会感觉很简单,其实不然,。: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么,进而确定递归函数的返回类型。确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,。

2024-09-17 22:28:06 895

原创 二叉树理论基础

刚刚我们说过了二叉树有两种存储方式顺序存储,和链式存储,顺序存储就是用数组来存,这个定义没啥可说的,我们来看看链式存储的二叉树节点的定义方式。Val int大家会发现二叉树的定义 和链表是差不多的,相对于链表 ,二叉树的节点里多了一个指针, 有两个指针,指向左右孩子。这里要提醒大家要注意二叉树节点定义的书写方式。在现场面试的时候 面试官可能要求手写代码,所以数据结构的定义以及简单逻辑的代码一定要锻炼白纸写出来。因为我们在刷leetcode。

2024-09-17 21:39:53 845

原创 347. 前 K 个高频元素

堆是一棵完全二叉树,树中每个结点的值都不小于(或不大于)其左右孩子的值。所以大家经常说的大顶堆(堆头是最大元素),小顶堆(堆头是最小元素),底层实现都是一样的,从小到大排就是小顶堆,从大到小排就是大顶堆。那么问题来了,定义一个大小为k的大顶堆,在每次移动更新大顶堆的时候,每次弹出都把最大的元素弹出去了,那么怎么保留下来前。个元素,只有小顶堆每次将最小的元素弹出,最后小顶堆里积累的就是前。题目数据保证答案唯一,换句话说,数组中前。思考一下,是使用小顶堆呢,还是大顶堆?可以的,我们用小顶堆,因为要统计最大前。

2024-09-17 19:33:56 845

原创 150. 逆波兰表达式求值

逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。,表示一个根据 逆波兰表示法 表示的算术表达式。返回一个表示表达式值的整数。

2024-09-17 17:22:03 378

原创 1047. 删除字符串中的所有相邻重复项

例如,在 “abbaca” 中,我们可以删除 “bb”,由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “aa” 可以执行重复项删除操作,所以最后的字符串为 “ca”。在完成所有重复项删除操作后返回最终的字符串。,重复项删除操作会选择两个相邻且相同的字母,并删除它们。上反复执行重复项删除操作,直到无法继续删除。给出由小写字母组成的字符串。

2024-09-17 17:01:51 199

原创 20. 有效的括号

判断字符串是否有效。

2024-09-17 16:51:08 308

原创 225. 用队列实现栈

使用一个队列便可实现栈了,思路很简单,一直操作的是队尾即可,直接上代码。(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。你所使用的语言也许不支持队列。你只能使用队列的标准操作 —— 也就是。请你仅使用两个队列实现一个后入先出。的栈,并支持普通栈的全部四种操作。:你能否仅用一个队列来实现栈。

2024-09-17 15:26:16 151

原创 232. 用栈实现队列

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作():实现MyQueue说明:你只能使用标准的栈操作 —— 也就是只有和is empty操作是合法的。你所使用的语言也许不支持栈。你可以使用list或者deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。你能否实现每个操作均摊时间复杂度为O1的队列?换句话说,执行n个操作的总时间复杂度为On,即使其中一个操作可能花费较长时间。

2024-09-17 15:12:15 533

原创 多道双指针类型题目

因为之前做其他专题的时候,基本已经介绍过双指针的概率和使用方法与场景了。所以该文就是做一下汇总整理,方便后续按专题复习。

2024-09-17 14:29:59 215

原创 459. 重复的子字符串

进行遍历,进行上述的判断。注意到一个小优化是,因为子串至少需要重复一次,所以。,检查是否可以通过由它的一个子串重复多次构成。,并且在这之后的每一个位置上的字符。因此,我们可以从小到大枚举。可以由它的一个长度为。给定一个非空的字符串。,都需要与它之前的第。的一半,我们只需要在。

2024-09-17 13:56:10 862

原创 344. 反转字符串(一和二)

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用。这道题目其实也是模拟,实现题目中规定的反转规则就可以了。的字符,写了一堆逻辑代码或者再搞一个计数器,来统计。:最基础不过的交换题目啦,直接上代码。就可以了,然后判断当前需要反转的区间。区间的起点,这样写,程序会高效很多。其实在遍历字符串的过程中,只要让。一些同学可能为了处理逻辑:每隔。,从字符串开头算起,每计数至。的额外空间解决这一问题。

2024-09-17 00:29:08 383

原创 18. 四数之和(实际是双指针类型的题目)

请你找出并返回满足下述全部条件且不重复的四元组。你可以按 任意顺序 返回答案。

2024-09-16 23:39:23 928

原创 15. 三数之和(实际是双指针类型的题目)

给你一个整数数组nums,判断是否存在三元组满足,同时还满足。请你返回所有和为0且不重复的三元组。注意:答案中不可以包含重复的三元组。3<=numslength<=3000−105<=numsi<=105两层for循环就可以确定a和b的数值了,可以使用哈希法来确定0-(a+b)是否在 数组里出现过,其实这个思路是正确的,但是我们有一个非常棘手的问题,就是题目中说的不可以包含重复的三元组。把符合条件的三元组放进[][]int。

2024-09-16 23:06:04 813

原创 383. 赎金信

因为题目说只有小写字母,那可以用一个长度为。一些同学可能想,用数组干啥,都用。去验证这个数组是否包含了。

2024-09-16 22:36:27 920

原创 454. 四数相加 II

并不合适使用哈希法,因为三数之和和四数之和这两道题目使用哈希法在不超时的情况下做到对结果去重是很困难的,很有多细节需要处理。,答案中不可以包含重复的四元组,大家可以思考一下,后续的文章我也会讲到的(实际就是回溯法的版块了)。如果本题想难度升级:就是给出一个数组(而不是四个数组),在这里找出四个元素相加等于。就可以,不用考虑有重复的四个元素相加等于。而这道题目是四个独立的数组,只要找到。本题是使用哈希法的经典题目,而。,请你计算有多少个元组。差不多,其实差很多。的情况,所以相对于题目。

2024-09-16 22:22:36 929

原创 1. 两数之和

本题呢,我就需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是。因为本题,我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,需要使用。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。的那 两个 整数,并返回它们的数组下标。,请你在该数组中找出 和为目标值。:你可以想出一个时间复杂度小于。首先强调一下 什么时候使用哈希法,那么我们就应该想到使用哈希法了。你可以按任意顺序返回答案。只会存在一个有效答案。

2024-09-16 21:14:15 987

原创 202. 快乐数

这题的关键其实就是在于什么时候可以退出循环,如果某一步计算出的结果发现曾经出现过了,说明后续结果也会一直不断重复,会进入了无限循环,此时我们应该退出了。而判断一个数字是否出现过,第一反应就是使用。中已存在,即进入了死循环,则退出;因此思路就很清晰了,首先定义一个。编写一个算法来判断一个数。集合,用来存放计算后的。或者进入死循环就返回。

2024-09-16 21:06:00 277

原创 349. 两个数组的交集

给定两个数组nums1和nums2,返回 它们的交集。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序。

2024-09-16 20:38:45 397

原创 242. 有效的字母异位词(排序后用Map或者滑动窗口用Map)

异位词排序之后的字符串是相等的,所以可以以s的每一个字符作为起点,取和p相同长度的字符,看看排序后是否相等即可。字母异位词(字母异位词是通过重新排列不同单词或短语的字母而形成的单词或短语,并使用所有原字母一次。最后如果record数组所有元素都为零0,说明字符串s和t是字母异位词,return true。那看一下如何检查字符串t中是否出现了这些字符,同样在遍历字符串t的时候,对。的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

2024-09-16 18:53:13 892

原创 707. 设计链表

以指示链表中的上一个节点。假设链表中的所有节点下标从。你可以选择使用单链表或者双链表,设计并实现自己的链表。是指向下一个节点的指针/引用。如果是双向链表,则还需要属性。

2024-09-16 16:17:32 426

原创 203. 移除链表元素

的节点,并返回 新的头节点。,请你删除链表中所有满足。给你一个链表的头节点。

2024-09-16 16:06:36 359

原创 54. 螺旋矩阵(定义四个方向然后遍历类)

按照顺时针遍历矩阵,将二维矩阵看成一维矩阵遍历每个元素,当索引越界或者元素已经被访问过则改变方向,改变方向顺序为右,下,左,上。螺旋遍历:从左上角开始,按照 向右、向下、向左、向上 的顺序 依次 提取元素,然后再进入内部一层重复相同的步骤,直到提取完所有元素。注意:本题与主站 54 题相同:https://leetcode-cn.com/problems/spiral-matrix/,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。所有元素,且元素按顺时针顺序螺旋排列的。

2024-09-15 21:41:38 1074

原创 209.长度最小的子数组(滑动窗口类)

例如出现[1,2,1,1,2,3,3,4]时,当摘到类型为3的水果时,需要将类型为1的水果都删除,但第二个位置有个类型为2的水果,也要计数减1(Map中对应2的水果类型计数减1,2类型水果比1类型水果后加入Map,所以计数一定会后变为0的,因此符合该轮删除的是1类型水果的诉求)中所有的字符以及它们的个数,用一个哈希表动态维护窗口中所有的字符以及它们的个数,如果这个动态表中包含。指针,和一个用于「收缩」窗口的 l 指针。,不断缩小符合条件的窗口,即窗口的起点后移,寻找以该位置为起点的新的符合条件的窗口。

2024-09-15 21:04:08 897

原创 27. 移除元素(双指针相关)

解释:函数应该返回新的长度5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。最容易想到的方法是将给定的字符串中的退格符和应当被删除的字符都去除,还原给定字符串的一般形式。解释:函数应该返回新的长度 2 ,并且原数组 nums的前两个元素被修改为 1, 2。快慢指针,从第二个数开始,只要与前一个数相等,则可以跳过他,快指针移动一步,不相等时,放于慢指针的位置,慢指针移动一步。删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的顺序可以改变。

2024-09-15 16:26:04 962

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除