数据结构
文章平均质量分 77
weixin_43270226
这个作者很懒,什么都没留下…
展开
-
代码随想录算法训练营第十八天|530. 二叉搜索树的最小绝对差,501. 二叉搜索树中的众数, 236. 二叉树的最近公共祖先
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。这道题目是二叉搜索树,中序遍历就是有序的,遍历有序数组的元素出现频率,从头遍历,那么一定是相邻两个元素作比较,然后就把出现频率最高的元素输出就可以了。给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即出现频率最高的元素)。:节点 5 和节点 4 的最近公共祖先是节点 5。原创 2024-09-28 23:52:25 · 140 阅读 · 0 评论 -
代码随想录算法训练营第十七天|654. 最大二叉树, 617. 合并二叉树,700. 二叉搜索树中的搜索,98. 验证二叉搜索树
合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。这道题目有个陷阱,不能单纯的比较左节点小于中间节点,右节点大于中间节点,要比较的是左子树所有节点小于中间节点,右子树所有节点大于中间节点。上面两个代码中,递归超时了,该树已经是二叉搜索树了,所以利用二分性质切分,参考答案。给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。:根节点的值是 5 ,但是右子节点的值是 4。只考虑根节点值情况,直接遍历就行。原创 2024-09-28 22:23:41 · 484 阅读 · 0 评论 -
代码随想录算法训练营第十六天|513. 找树左下角的值,112. 路径总和,113. 路径总和 II, 106. 从中序与后序遍历序列构造二叉树
判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum。给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树。给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。原创 2024-09-26 22:00:03 · 327 阅读 · 0 评论 -
代码随想录算法训练营第十五天|110.平衡二叉树,257. 二叉树的所有路径,404. 左叶子之和,222. 完全二叉树的节点个数
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24。给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。总结:递归相对容易理解掌握,迭代法待后续加深学习。叶子节点 是指没有子节点的节点。原创 2024-09-26 20:04:44 · 170 阅读 · 0 评论 -
代码随想录算法训练营第十三天|树的遍历
递归二叉树程序代码基本相同,能写出一个稍微改改其他的也使用,这里需要注意的。非递归写法理解需要一定基础,待后续补充。原创 2024-09-25 09:23:51 · 98 阅读 · 0 评论 -
代码随想录算法训练营第十四天|1226. 翻转二叉树,101. 对称二叉树,104.二叉树的最大深度,111.二叉树的最小深度
参考方法3层次遍历和第一个方法类似,缺失值None值补充,若对称则每层对称,正反序一致。注意这里的每层判断写法,每层循环完后初始化,该方法理解稍微简单。和层序遍历不同,不涉及输出,层序遍历格式可以统一。针对二叉树的问题,解题之前一定要想清楚究竟是前中后序遍历,还是层序遍历。左右遍历,左子树遍历按照中左右,右子树遍历按照中右左方式,缺失值用None填充。参考方法1递归法,从理解上不如迭代法清晰,代码实现工作量没优势。参考方法2迭代法,遍历中判别,存储结构可选栈或队列。非递归写法,以非递归遍历树的模板。原创 2024-09-25 09:22:19 · 136 阅读 · 0 评论 -
代码随想录算法训练营第十一天|150. 逆波兰表达式求值,239. 滑动窗口最大值 ,347. 前 K 个高频元素
栈的简单应用,这里有个坑,在python截断除法X // Y不是真的直接去掉小数点后面的数字,而是类似模块math中的floor方法,即向下取整,且负值的取整方式也是这样的。给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6。:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9。原创 2024-09-21 22:15:34 · 584 阅读 · 0 评论 -
代码随想录算法训练营第十天|232. 用栈实现队列,225. 用队列实现栈, 20. 有效的括号,1047. 删除字符串中的所有相邻重复项
例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。原创 2024-09-20 22:13:01 · 523 阅读 · 0 评论 -
代码随想录算法训练营第九天|151. 反转字符串中的单词,55.右旋转字符串,28. 找出字符串中第一个匹配项的下标,459. 重复的子字符串
参考官方方法,如果一个字符串s是由重复子串组成,那么最长相等前后缀不包含的子串一定是字符串s的最小重复子串,此为充分必要条件,证明省略。给你一个字符串 s ,请你反转字符串中 单词 的顺序。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。观察next数组,发现若字符串可由重复子串构成,最长相等前后缀不包含的子串长度是字符串s的最小重复子串,参考上面KMP算法。原创 2024-09-19 20:46:36 · 599 阅读 · 0 评论 -
代码随想录算法训练营第八天|344. 反转字符串,541. 反转字符串 II,54. 替换数字
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。如果剩余字符少于 k 个,则将剩余字符全部反转。官方参考方法,题意进行模拟:反转每个下标从 2k 的倍数开始的,长度为 k 的子串。若该子串长度不足 k,则反转整个子串。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。原创 2024-09-18 15:06:01 · 360 阅读 · 0 评论 -
代码随想录算法训练营第七天|454.四数相加II,383. 赎金信,15. 三数之和 ,18. 四数之和
参考力扣官方题解,统计 magazine 中每个英文字母 a 的次数 cnt[a],再遍历统计 ransomNote 中每个英文字母的次数,如果发现 ransomNote 中存在某个英文字母 c 的统计次数大于 magazine 中该字母统计次数 cnt[c],则此时我们直接返回 false。给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!= k ,同时还满足 nums[i] + nums[j] + nums[k] == 0。原创 2024-09-17 22:37:30 · 630 阅读 · 0 评论 -
代码随想录算法训练营第六天|242. 有效的字母异位词,349. 两个数组的交集 ,202. 快乐数,1. 两数之和
参考其他人方法,使用 “快慢指针” 思想,找出循环:“快指针” 每次走两步,“慢指针” 每次走一步,当二者相等时,即为一个循环周期。给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。这道题目和上面基本一样,不考虑顺序,采用字典可以解决,字典索引为数组元素,索引值为元素下标。分别建立字典哈希表,索引为字符当前字符,索引值为出现次数,判断两个字典是否相等。题目中字符串只有小写字符所以字符唯一,简单思路,原创 2024-09-16 15:23:44 · 737 阅读 · 0 评论 -
代码随想录算法训练营第四天 | 24.两两交换链表中的节点,19.删除链表的倒数第N个节点,142.环形链表II,160 相交链表
假设相遇点距环的起点的距离为 m,那么结合上图的 slow 指针,环的起点距头结点 head 的距离为 k - m,也就是说如果从 head 前进 k - m 步就能到达环起点。可以看到,当快慢指针相遇时,让其中任一个指针指向头节点,然后让它俩以相同速度前进,再次相遇时所在的节点位置就是环开始的位置。参考答案使用了临时变量temp1 存储未遍历的链表,temp 存储用于交换顺序的链表节点,交换完成后,temp1放在完成排序链表后。简单思路,先遍历链表,找到链表长度后,根据条件,遍历链表跳过需要删掉的节点。原创 2024-09-14 23:28:45 · 864 阅读 · 0 评论 -
代码随想录算法训练营第三天 | 203.移除链表元素 ,707.设计链表,206.反转链表
关键在于移除头结点和移除其他节点的操作是不一样的,因为链表的其他节点都是通过前一个节点来移除当前节点,而头结点没有前一个节点。在写代码的时候也需要单独写一段逻辑来处理移除头结点的情况。参考给链表设置虚拟头节点,统一代码形式,代码参考。给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点。参考上面思路,添加虚拟头节点,遍历链表,next指向上一次的链表值。给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。原创 2024-09-13 15:37:56 · 187 阅读 · 0 评论 -
代码随想录算法训练营第二天 | 209.长度最小的子数组,59.螺旋矩阵II
另一种思路,考虑整个序列满足条件的话,去掉左边或者右边端点元素后,二次判断,满足条件的子序列一定在两者其一,采用归并方法直到找到无法去除端点元素的子序列。再换思路,从头遍历子序列,有发现满足条件子序列,从子序列头开始判断,去掉后是否满足,满足条件的k值添加到新列表中,最后返回列表最小值,AC通过.首先想到子数组是连续的,从头遍历,遇到满足条件,记录对应长度,然后遍历下一个字符,总耗时是。该方法会超过时间限制,循环过程中并没有利用到上一次循环的结果,存在计算浪费。除了返回的矩阵以外,空间复杂度是常数。原创 2024-09-12 14:43:30 · 684 阅读 · 0 评论 -
代码随想录算法训练营第一天| 704. 二分查找,27. 移除元素,977.有序数组的平方
第一日打开,耗时2个小时左右原创 2024-09-11 17:39:20 · 788 阅读 · 0 评论