数据结构与算法
文章平均质量分 72
以刷题的方式从易到难地学习算法
苦练鸡本工
算法百日筑基。 个人博客:zhangbuzai.github.io欢迎来看看
展开
-
(第27天)【leetcode题解】101、对称二叉树 100、相同的树 572、另一颗树的子树
在对节点进行比较时,要处理好节点为空的情况因为在这一类型题中,比较节点值是通过进行的,若没有处理节点为空的情况,则在处理数据时会报错。因此,对于节点为空的情况,需要单独处理。原创 2024-06-06 17:37:02 · 1004 阅读 · 0 评论 -
(第32天) 513、找树左下角的值 112、路径总和 113、路径总和II
判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum。给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。找出所有符合要求的路径,这就需要在上一题的基础上遍历整颗二叉树,一遇到符合要求的路径就把这条路径加入结果集。给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。严格来说,本题的目的是寻找一条符合要求的路径,而遍历整颗二叉树不是必须的。原创 2024-06-11 19:17:54 · 956 阅读 · 0 评论 -
(第30天)二叉树阶段总结
深度和高度节点深度:根节点到当前节点的节点个数节点高度:叶子节点到当前节点的节点个数二叉树的最大深度:根节点到离它最远的叶子节点的节点个数,其实就是二叉树的高度二叉树的最小深度:根节点到离它最近的叶子节点的节点个数“求深度和高度的题目” ==> “求最小深度和最大深度(高度)的题目”,题目中让求二叉树(最大/小)深度的问题完全可以转化为求(特定)高度的问题,都可以用遍历的方法加上条件判断语句解决。有用的概念节点深度、二叉树高度、二叉树最大深度、二叉树最大高度节点高度(除外)原创 2024-06-09 20:48:08 · 1083 阅读 · 0 评论 -
(第31天)【leetcode题解】404、左叶子之和
给定二叉树的根节点 root ,返回所有左叶子之和。原创 2024-06-10 20:08:59 · 447 阅读 · 0 评论 -
(第28天)【leetcode题解】104、二叉树的最大深度 559、N叉树的最大深度 111、二叉树的最小深度
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。N 叉树输入按层序遍历序列化表示,每组子节点由空值分隔。给定一个二叉树 root ,返回其最大深度。给定一个 N 叉树,找到其最大深度。说明:叶子节点是指没有子节点的节点。给定一个二叉树,找出其最小深度。原创 2024-06-07 16:54:50 · 671 阅读 · 0 评论 -
(第26天)【leetcode题解】226、翻转二叉树 589、N叉树的前序遍历 590、N叉树的后序遍历
树的操作都要在遍历的基础上,在遍历的过程中添加某些操作。二叉树节点定义:int val;创建二叉树节点时要用3. 递归三要素:确定参数和返回值、确定终止条件、确定递归逻辑4. 树的迭代遍历:深度优先遍历离不开栈、广度优先遍历离不开队列。原创 2024-06-05 16:23:10 · 1745 阅读 · 0 评论 -
(第29天)【leetcode题解】222、完全二叉树的节点个数 110、平衡二叉树 257、二叉树的所有路径
节点的高度:从最下层节点到该节点的节点个数。节点的深度:从根节点到该节点的节点个数。求深度要从上往下查,用前序遍历(中左右)。求高度要从下往上查,用后序遍历(左右中)。原创 2024-06-08 16:43:05 · 1029 阅读 · 0 评论 -
(第33天)106.从中序与后序遍历序列构造二叉树 105、从前序与中序遍历序列构造二叉树
在通过两个序列构造二叉树的时候,可以先通过前/后序遍历确定根节点,然后在中序遍历序列中找到左右子树的序列,然后把子序列当成子树的序列,通过重复这个过程,重复找出根节点,构造完成整棵树只有前/后序序列 和 中序序列配合才能构造出一颗完整的树, 前后序序列在一起构造不出完整的树,因为它们只能得到根节点,得不到左右子树的节点序列。原创 2024-08-04 00:00:38 · 420 阅读 · 0 评论 -
(第23天)【leetcode题解】二叉树的统一迭代法
【代码】(第23天)【leetcode题解】二叉树的统一迭代法。原创 2024-05-24 15:10:10 · 476 阅读 · 0 评论 -
(第22天)【leetcode题解】二叉树的迭代遍历
前序遍历和中序遍历的不同前序遍历的顺序为中左右,在遍历访问节点的过程中就可以把元素值加入结果集;而中序遍历的顺序为左中右,需要先到达最底层的左子节点在开始将元素加入结果集。这决定了两种遍历方式在实现上的不同。关于root节点为空的情况前序遍历和后序遍历实现时都需要先将root节点压入栈中,如果root为空时,在执行之后把root节点值加入res时就会报错。因此,在这两个实现中,需要先判断root是否为空。后序遍历因为要从root开始遍历整棵树,遍历的条件之一就是root不为空。原创 2024-05-23 19:34:15 · 696 阅读 · 1 评论 -
(第24天)【leetcode题解】二叉树的层序遍历
给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历。给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。给你二叉树的根节点 root ,返回其节点值的 层序遍历。层序遍历的时候,队列que每次存储一层数据,只要判断当前遍历到的数据是否是这一层最后一个数据即可。从root开始,每遍历到一个节点,在把它放入结果集的同时,把它的子节点按从左到右的顺序加入队列。原创 2024-06-03 21:32:58 · 653 阅读 · 0 评论 -
(第25天)【leetcode题解】二叉树的层序遍历
给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。输入:root = [1,null,3,2,4,null,5,6]输入:root = [3,9,20,null,null,15,7]输入:root = [3,9,20,null,null,15,7]输入: root = [1,3,2,5,3,null,9]输入:root = [1,2,3,4,5,6,7]输出:[1,#,2,3,#,4,5,6,7,#]原创 2024-06-04 14:56:47 · 943 阅读 · 0 评论 -
(第19天)【leetcode题解】239、滑动窗口最大值 347、前K个高频元素
先统计频数需要遍历nums花费O(n);之后遍历频率map最多花费O(n),其中每次堆操作至多花费O(logk);总体花费O(nlogk)。给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。时间复杂度:O(n);nums中的元素最多被push()和pop()队列一次,因此总体时间复杂度为O(n);空间复杂度:O(n);哈希表大小为O(n),堆大小为O(k)。空间复杂度:O(k);原创 2024-05-16 17:34:42 · 954 阅读 · 0 评论 -
(第21天)【leetcode题解】二叉树的递归遍历
给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历。给定一个二叉树的根节点 root ,返回 它的 中序 遍历。给你二叉树的根节点 root ,返回它节点值的 前序 遍历。空间复杂度:O(n);调用函数使用的栈空间。空间复杂度:O(n);调用函数使用的栈空间。空间复杂度:O(n);调用函数使用的栈空间。时间复杂度:O(n);时间复杂度:O(n);时间复杂度:O(n);原创 2024-05-22 19:55:11 · 727 阅读 · 0 评论 -
(第19天)【leetcode题解】栈与队列基础与题型总结
栈与队列底层实现通常为数组或链表。栈多用于解决相应元素匹配、后缀运算等问题。队列多用于解决动态数据流中求最值、对元素排序等问题。队列中的单调队列和优先级队列是特殊场景下解决问题的利器,要熟悉其特性,活学活用它们的某些行为,例如push()等。在不同场景下选择合适的数据结构,可以使解决问题变得简单和高效。原创 2024-05-16 22:12:36 · 463 阅读 · 0 评论 -
(第18天)【leetcode题解】20、有效的括号 1047、删除字符串中的所有相邻重复项 150、逆波兰表达式求值
栈可以用来进行括号匹配。栈可以用来相邻重复项匹配。用栈匹配的机制为相邻元素的匹配。特定情况下,可以用string字符串来作为栈进行匹配,因为它具有栈先入后出特性相对应的操作:访问栈顶元素、入栈、出栈。针对不同的问题,选择合适的数据结构有利于高效地解决问题。栈适用于计算机的递归操作和后缀表示法运算。原创 2024-05-15 15:48:53 · 1306 阅读 · 0 评论 -
(第20天)二叉树理论基础
到现在已经了解了常见的数据结构:数组、链表、树、哈希表、字符串、栈与队列。然而,在这些数据结构之间也有一些联系:一些数据结构可以由更基础的数据结构作为容器去实现。现在把这些数据结构分为一级基础数据结构和二级基础数据结构来进行总结思考。(一般情况下)一级基础数据结构可以用来实现二级基础数据结构。此外,会先分析一级基础数据结构的内在结构。原创 2024-05-21 23:45:42 · 938 阅读 · 0 评论 -
(第15天)字符串基础理论和题型总结
对于字符串的操作考验了对代码的掌控能力,需要用双指针法、扩容等操作来解决问题。其中,对字符串的匹配一方面考察了对代码的掌控能力(暴力解法、KMP算法),另一方面考察了推导解决问题方法的能力(KMP算法)。原创 2024-05-10 19:38:14 · 543 阅读 · 0 评论 -
(第17天)栈与队列理论基础
栈与队列的逻辑结构决定了它们的操作规则。栈与队列都是线性结构(逻辑),因此用来对它们进行底层实现的数据结构也多是线性结构。原创 2024-05-14 10:27:45 · 230 阅读 · 0 评论 -
(第16天)双指针法题型总结
双指针法有很多作用。在有些题中用于解决问题。例如:链表中相关题目。在有些题中用于降低时间复杂度。在有些题中可以降低空间复杂度。原创 2024-05-11 16:16:49 · 598 阅读 · 0 评论 -
(第17天)【leetcode题解】232、用栈实现队列 225、用队列实现栈
你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。时间复杂度:push和empty为O(1)、pop和peek为O(n);int pop() 从队列的开头移除并返回元素。时间复杂度:pop为O(n),其他为O(1);int peek() 返回队列开头的元素。原创 2024-05-14 20:17:05 · 525 阅读 · 0 评论 -
(第15天)【leetcode题解】459、重复的子字符串
时间复杂度:O(n);得到前缀表时遍历字符串需要O(n),判断重复子字符串只用了固定的操作数。空间复杂度:O(n);需要前缀表存储字符串的所有前缀子串(包括它自身)的最长公共前后缀长度。因此从小到大枚举出所有可能的子串长度n1,再对这个子串进行上述的判断即可。给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。枚举子串的时间复杂度为O(n),遍历判断子串的时间复杂度为O(n)。优化:这个子串至少要在s中重复一次,所以n1的范围为[1,n/2]。空间复杂度:O(1);原创 2024-05-10 17:15:38 · 990 阅读 · 0 评论 -
(第13、14天)【leetcode题解】#右旋字符串 28、找出字符串中第一个匹配项的下标
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。这都需要使用指针(下标),双指针是常用的,它可以帮助原地修改字符串,还可以降低时间复杂度。匹配时只遍历一次文本串,每遍历到一个字符只做一次判断和常数级的操作。1.字符串的操作和数组有共性:需要下标访问、各种操作都是基于使用下标进行的元素修改。最多遍历全部的本文串,并在每次遍历文本串的内部遍历模式串。翻转操作需要遍历数量级为n的次数。:反转顺序发生改变。原创 2024-05-09 18:39:43 · 1928 阅读 · 1 评论 -
(第11天)【leetcode题解】344、反转字符串 541、反转字符串II #替换数字
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。例如,对于输入字符串 “a1b2c3”,函数应该将其转换为 “anumberbnumbercnumber”。:使用两个指针分别指向要交换的元素,进行交换操作。给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。原创 2024-05-06 22:36:12 · 750 阅读 · 0 评论 -
(第12天)【leetcode题解】151、反转字符串中的单词
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。单词是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的单词分隔开。返回单词顺序颠倒且单词之间用单个空格连接的结果字符串。给你一个字符串 s ,请你反转字符串中单词的顺序。空间复杂度:O(1);:空间复杂度为O(1);时间复杂度:O(n);原创 2024-05-07 21:10:36 · 537 阅读 · 0 评论 -
哈希表总结篇:哈希表基础理论和常见题型
我们常用哈希表来快速访问元素、快速判断是否包含目标元素。哈希表有三类:array、set、map三种哈希结构各有特点:array必须要求明确的大小、set不需要有明确大小、map以pair的形式存储数据。我们应根据不同情况和三种哈希结构的特点选用最合适的哈希结构。原创 2024-04-30 19:05:38 · 486 阅读 · 0 评论 -
(第10天)【leetcode题解】383、赎金信 13、三数之和 18、四数之和
对于a、b、c三个值中的每一个来说,在遍历时,只要(a/b/c)前后两个遍历到的值相同,那么形成的符合要求的三元组一定会出现相同的情况。分别遍历ransomNote和magazine分别为O(n),因此总体时间复杂度为O(2n);给定一个整数数组nums,在nums中找到nums[i]、nums[j]、nums[k],使得三者相加等于0.:对于四元组的每个元素,凡是前后重复出现的都需要去重,跳到nums中的下一个值开始遍历。),双指针共同搜索nums中剩下的值,使用O(n);空间复杂度:O(n);原创 2024-04-29 22:22:33 · 857 阅读 · 0 评论 -
(第9天)【leetcode题解】202.快乐数 1.两数之和 454.四数相加II
文章中的题目有多种解法,但为了练习对哈希表的使用、提升对哈希结构的理解,这里一律使用哈希表来解题。解题过程中,使用哈希表可能是使用哈希表的某种特性,可能是其他…快速判断一个元素是否在集合中。(202)原创 2024-04-24 19:07:01 · 1298 阅读 · 0 评论 -
(第7天)【leetcode题解】19、删除链表的倒数第n个节点 面试题02.07.链表相交 142、环形链表II
为了表示给定链表中的环,使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。示例1:输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]如果链表无环,则返回 null。示例 3:输入:head = [1,2], n = 1 输出:[1]给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。示例 2:输入:head = [1], n = 1 输出:[]原创 2024-04-22 17:41:58 · 1016 阅读 · 0 评论 -
(第8天)【leetcode题解】242、有效的字母异位词 349、 两个数组的交集
排序的时间复杂度为O(nlogn)、比较字符串是否相等的时间复杂度为O(n),总体的时间复杂度为O(nlogn)。可以用哈希表来存储结果,注意本题的结果数量是不固定的,因此不能用固定空间都数组做哈希表;:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。m表示nums1的长度,n表示nums2的长度。最后遍历哈希表,如果其中有不为0的元素,则表示s和t不是异位词。如果s的长度和t的长度不相等,那么这两个字符串一定不是异位词。遍历哈希表需要的时间复杂度为O(n);原创 2024-04-23 14:17:46 · 476 阅读 · 0 评论 -
链表理论基础和题型总结
链表的操作中,指针至关重要,双指针使用的频率很高。对于一些问题,需要进行数学推导,使用快慢指针通过题目要求找到满足题意得数量关系,然后用指针的操作表示出来。在链表的相关题型中,大部分判断条件都是指针空还是非空两个指针是否相等。而不是用单纯的存储数字的变量进行条件判断。原创 2024-04-22 18:52:25 · 356 阅读 · 0 评论 -
(第6天)【leetcode题解】24、两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。建议在具体思考操作流程的时候画图。时间复杂度:O(n);空间复杂度:O(1);原创 2024-04-21 23:17:12 · 320 阅读 · 1 评论 -
(第5天)【leetcode题解】707设计链表 206、翻转链表
val 是当前节点的值,next 是指向下一个节点的指针/引用。定义cur指针来操作next、定义pre指针来指向cur的前一个节点、定义temp指针来保存cur的下一个节点。如果是双向链表,则还需要属性 prev 以指示链表中的上一个节点。时间复杂度:涉及index的操作为O(index),其他的为O(1);普通方法是重新定义一个链表,来实现链表的翻转,但缺点是这样太浪费空间。给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。空间复杂度:O(n),递归调用使用了n层栈帧空间。原创 2024-04-20 16:28:22 · 722 阅读 · 0 评论 -
(第3天)【leetcode题解】59、螺旋矩阵II
把生成的数字从小到大按顺时针顺序螺旋排列给正方形数组(模拟出围着正方形数组顺时针移动即可)。的所有元素,把这些元素从小到大按顺时针顺序螺旋排列到。输入一个正整数n,生成从1到n。原创 2024-04-18 16:51:53 · 509 阅读 · 1 评论 -
(第2天)【leetcode题解】977.有序数组的平方、209.长度最小的子数组
给你一个按非递减顺序排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。给定一个含n个正整数的数组和一个正整数target。找出该数组中满足总和大于等于target的。如果不存在符合条件的子数组,返回0。时间复杂度:O(n+nlogn)连续子数组并返回其长度。空间复杂度:O(1)时间复杂度:O(n)空间复杂度:O(n)空间复杂度:O(1)时间复杂度:O(n)空间复杂度:O(1)原创 2024-04-17 16:54:55 · 555 阅读 · 0 评论 -
基于数组的几类算法题总结
这里对题目的详细流程不做赘述,只回顾一遍不同题型中的重难点。原创 2024-04-18 18:06:36 · 683 阅读 · 1 评论 -
(第4天)【leetcode题解】203、移除链表元素
头节点为要删除的节点时,把头节点往后移一位,同时手动删除该节点的内存空间。非头节点为要删除的节点时,把该节点的前一位节点的。指向下下个节点,同时手动删除该节点的内存空间。这样就可以对原链表用统一的方法进行元素移除了。设置一个虚拟头节点,再进行移除节点的操作。这种方法需要单独写一段逻辑来移除头节点。直接使用原来的链表进行移除操作。的节点,并返回新的头节点。时间复杂度:O(n);空间复杂度:O(1);时间复杂度:O(n);空间复杂度:O(1);给你一个链表的头节点。,删除链表中所有满足。原创 2024-04-19 17:35:13 · 406 阅读 · 0 评论 -
(第1天)【leetcode题解】704、二分查找 27、移除元素
左指针可以在不断右移之后达到初始right指向的位置(nums.size()-1),因此循环条件为(left原创 2024-04-16 15:57:51 · 491 阅读 · 0 评论