自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Docker 部署 RocketMQ (图文并茂超详细)

使用 Docker 部署 RocketMQ 是一种高效便捷的方式,适合快速启动和管理分布式消息队列服务。首先,从 Docker Hub 拉取 RocketMQ 的官方镜像。RocketMQ 主要包括 NameServer 和 Broker 两个核心组件,因此需要分别启动对应的容器。通过命令行启动 NameServer 容器,配置必要的端口和网络设置。接着,启动 Broker 容器,配置连接到 NameServer 的地址,并指定数据存储路径等参数。RocketMQ 容器在 Docker 的隔离环境中运行

2024-09-10 08:00:00 13281 41

原创 Docker 部署 Nacos (图文并茂超详细)

使用 Docker 部署 Nacos 是一种高效的方法,可以快速启动和管理服务发现与配置管理平台。首先,从 Docker Hub 拉取 Nacos 的官方镜像。然后,通过命令行启动容器,可以配置端口、数据库连接、集群模式等参数。Nacos 在 Docker 的隔离环境中运行,与主机系统独立,减少了依赖冲突的问题。为了确保配置数据的持久性,可以将 Nacos 的数据目录和日志目录挂载到主机系统中,以避免因容器重启或删除而丢失数据。

2024-09-09 08:00:00 21589 44

原创 CentOS 超详细保姆级安装教程(每步都有截图)

在 VMware 中安装和配置 CentOS 是许多系统管理员和开发者常用的虚拟化方法。首先,需要在计算机上安装 VMware Workstation 或 VMware Player,然后下载最新的 CentOS ISO 文件。启动 VMware,创建一个新的虚拟机,选择“安装程序光盘映像文件(iso)”选项,加载下载的 CentOS ISO 文件。接下来,配置虚拟机的硬件资源,包括分配内存、CPU 核心数量和硬盘空间。建议至少分配 2GB 内存和 20GB 硬盘空间以保证 CentOS 的顺利运行。

2024-09-01 11:22:48 5855

原创 Ubuntu 超详细保姆级安装教程(每步都有截图)

在 VMware 中安装和配置 Ubuntu 是一种常见的虚拟化实践,适用于开发、测试和学习目的。首先,确保已安装 VMware Workstation 或 VMware Player,并下载最新版本的 Ubuntu ISO 文件。启动 VMware,创建一个新的虚拟机,选择"安装程序光盘映像文件(iso)"选项,选择下载的 Ubuntu ISO 文件。然后,配置虚拟机的硬件设置,包括内存、处理器数量和硬盘大小等,建议至少分配 2GB 内存和 20GB 硬盘空间。

2024-09-01 11:17:03 92744 65

原创 1315. 祖父节点值为偶数的节点和

摘要: 该算法通过DFS遍历二叉树,统计所有祖父节点值为偶数的节点之和。递归过程中传递父节点和祖父节点的值,当祖父节点存在且为偶数时累加当前节点值。时间复杂度O(n),空间复杂度O(h),其中n为节点数,h为树高。核心思路是利用递归参数传递层级信息,避免重复遍历。

2025-11-05 02:00:00 499

原创 1457. 二叉树中的伪回文路径

本文介绍了如何统计二叉树中伪回文路径的数量。算法通过DFS遍历所有根到叶子的路径,使用数组记录节点值出现次数的奇偶性。当到达叶子节点时,若数组中奇数位不超过1,则该路径可重排为回文。代码通过回溯处理状态恢复,时间复杂度O(n),空间复杂度O(h)。该方案高效解决了伪回文路径判定问题。

2025-11-05 01:30:00 450

原创 1448. 统计二叉树中好节点的数目

摘要: LeetCode题目统计二叉树中的「好节点」,定义为从根到该节点的路径上无节点值大于当前节点值。采用深度优先搜索(DFS)遍历树,维护路径最大值mx,若当前节点值≥mx则计数+1。递归左右子树时更新mx。时间复杂度O(n),空间复杂度O(h)。Java代码通过DFS实现,累计左、右子树和当前节点的好节点数。

2025-11-04 08:00:00 422

原创 0199. 二叉树的右视图

摘要: 题目要求返回二叉树从右侧视角看到的节点值列表。采用深度优先搜索(DFS)进行「先右后左」的前序遍历,当当前深度等于结果列表长度时,记录该层首个访问的节点(即最右侧节点)。代码通过递归实现,时间复杂度为O(n),空间复杂度为O(h)。 关键词: 二叉树、右侧视图、DFS、递归、层序遍历

2025-11-04 07:00:00 295

原创 0129. 求根节点到叶节点数字之和

LeetCode题目129:求根到叶子节点数字之和。给定一棵二叉树,每个节点包含0-9的数字,每条根到叶子的路径代表一个数字(如1→2→3表示123),要求返回所有路径数字的总和。采用深度优先搜索(DFS)遍历,维护当前路径数字x(x=x*10+node.val),遇到叶子节点时累加到结果ans中。时间复杂度O(n),空间复杂度O(h)。Java代码通过递归实现DFS,简洁高效。

2025-11-03 08:00:00 363

原创 0112. 路径总和

摘要: LeetCode题目《路径总和》要求判断二叉树中是否存在从根到叶子的路径,其节点值之和等于给定目标。采用深度优先搜索(DFS)递归求解:遍历时递减目标值,若到叶子节点时目标值为0则返回成功,否则递归检查左右子树。代码简洁高效,时间复杂度O(n),空间复杂度O(h)。

2025-11-03 07:00:00 288

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

摘要: 题目要求计算二叉树的最小深度,定义为根节点到最近叶子节点的最短路径节点数。采用深度优先搜索(DFS)遍历所有路径,遇到叶子节点时更新最小深度。空树返回0。Java代码通过递归实现DFS,时间复杂度O(n),空间复杂度O(h)。题目链接

2025-11-02 08:00:00 367

原创 0104. 二叉树的最大深度

摘要: 题目要求计算二叉树的最大深度,即从根节点到最远叶子节点的最长路径节点数。采用深度优先搜索(DFS)递归遍历,每深入一层深度值加1,并更新全局变量记录最大深度。代码使用Java实现,时间复杂度O(n),空间复杂度O(h),其中n为节点数,h为树高。 查看原题

2025-11-02 07:00:00 266

原创 0671. 二叉树中第二小的节点

摘要:给定特殊二叉树(节点值等于子节点最小值),要求找出严格大于最小值的最小值(第二小值)。解题关键在于利用根节点为最小值的特点,遍历时记录大于根节点的最小候选值。实现采用深度优先搜索,时间复杂度O(n),空间复杂度O(h)。若不存在第二小值则返回-1。

2025-11-01 08:00:00 293

原创 0404. 左叶子之和

文章摘要: LeetCode题目求二叉树所有左叶子节点之和,左叶子定义为某节点的左子节点且自身无子节点。采用递归解法,遍历时先处理左右子树,再检查当前节点的左子节点是否为叶子节点,若是则累加其值。Java实现简洁高效,时间复杂度和空间复杂度分别为O(n)和O(h)。题目链接:https://leetcode.cn/problems/sum-of-left-leaves

2025-11-01 07:00:00 408

原创 LCP 44. 开幕式焰火

题目要求统计二叉树中不同颜色节点的数量。通过深度优先遍历(DFS)访问所有节点,使用哈希集合记录出现过的颜色值,最终集合的大小即为不同颜色的数目。该算法时间复杂度为O(n),空间复杂度为O(n)。

2025-10-31 08:00:00 306

原创 0872. 叶子相似的树

LeetCode 题目:判断两棵二叉树的叶节点序列是否相同。通过深度优先遍历(DFS)分别获取两棵树的叶节点值列表,然后比较两个列表是否完全一致。时间复杂度为O(n₁ + n₂),空间复杂度与树高相关。代码使用递归实现DFS遍历,简洁高效。

2025-10-31 07:00:00 261

原创 0145. 二叉树的后序遍历

本文介绍了二叉树后序遍历的两种实现方法。题目给定根节点,要求返回后序(左→右→根)节点值序列。递归法按左、右、根顺序递归遍历;迭代法使用栈模拟递归过程。代码示例展示了Java递归实现,时间复杂度O(n)(每个节点访问一次),空间复杂度O(n)(最坏递归栈深度为n)。适用于需要后序遍历二叉树的场景。

2025-10-30 08:00:00 607

原创 0094. 二叉树的中序遍历

本文介绍了二叉树中序遍历的两种实现方法:递归法和非递归法(使用栈)。递归法按照左-根-右顺序访问节点,代码简洁;非递归法利用栈模拟递归过程。示例代码展示了Java递归实现,时间复杂度O(n),空间复杂度O(n)。适用于需要按特定顺序遍历二叉树的场景。

2025-10-30 07:00:00 402

原创 0144. 二叉树的前序遍历

摘要: 本文介绍了二叉树前序遍历(根→左→右)的递归实现方法。通过深度优先搜索(DFS),先访问根节点,再递归遍历左子树和右子树。提供Java代码示例,并分析时间/空间复杂度均为O(n)。题目源自LeetCode,链接已附。

2025-10-29 23:49:41 512

原创 0430. 扁平化多级双向链表

本文介绍了如何将多级双向链表扁平化的算法。通过递归处理每个节点的child链表,将其插入到当前节点与next节点之间,最终得到一个单层双向链表。算法时间复杂度为O(n),每个节点仅被处理常数次;空间复杂度取决于递归深度,为O(d)。该解法简洁高效,能够正确处理多层嵌套的链表结构。

2025-10-29 23:45:46 417

原创 0138. 随机链表的复制

摘要:该题要求深拷贝带随机指针的链表。解题思路包括哈希表法(先创建节点映射,再补全指针)和原地三步法(O(1)空间)。参考代码使用哈希表,两次遍历完成克隆,时间复杂度O(n),空间复杂度O(n)。核心是通过映射关系确保next和random指针正确复制。

2025-10-28 00:00:00 373

原创 0382. 链表随机节点

本文介绍了两种从单链表中随机返回节点值的算法。第一种方法预先遍历链表并存储所有节点值到数组,查询时随机返回数组元素,实现简单但需要额外O(n)空间。第二种水塘抽样算法仅需一次遍历,以1/i的概率选择第i个节点,保证等概率且无需额外空间。两种方法分别适用于不同场景:数组法适合频繁查询但链表较小的情况,水塘抽样适合链表极大或空间受限的情况。时间与空间复杂度分别为O(1)/O(n)和O(n)/O(1)。

2025-10-28 00:00:00 402

原创 1206. 设计跳表

本文介绍了跳表(Skiplist)的设计与实现。跳表是一种支持快速查找、插入和删除的数据结构,期望时间复杂度为O(log n)。参考实现使用Java完成,包含节点类SkiplistNode和跳表类Skiplist。关键点包括:随机层数生成、多层指针维护、边界处理(允许重复值)和复杂度优化。实现中采用哨兵节点简化边界条件,并复用Random对象提高性能。erase操作时仅遍历待删节点的最高层,减少不必要的检查。该实现支持search、add和erase三种基本操作,适用于需要高效查询和修改的场景。

2025-10-27 08:00:00 276

原创 0432. 全 O(1) 的数据结构

本文介绍了如何设计一个支持 inc、dec、getMaxKey 和 getMinKey 操作的 AllOne 数据结构。通过分析现有实现的问题,提出了一种基于“计数桶”双链表和哈希表的优化方案,确保所有操作均摊时间复杂度为 O(1)。关键点包括:使用双链表维护不同计数的桶,每个桶存储对应计数的键集合;哈希表记录键到桶节点的映射;在相邻桶之间移动键以保持有序性。参考实现展示了这一方案的 Java 代码,并分析了其复杂度。该设计高效且易于理解,适用于需要频繁操作键计数的场景。

2025-10-27 07:00:00 539

原创 0460. LFU 缓存

本文介绍了LFU缓存的设计与实现,通过双层映射结构(keyToFreq和freqToMap)实现O(1)时间复杂度的get和put操作。核心思路是使用LinkedHashMap维护同频次键的LRU顺序,并动态更新minFreq指向当前最小频次层。当缓存满时,从minFreq层移除最久未使用的键。代码实现需要注意边界条件(如capacity=0)和更新逻辑,确保在键存在时仅提升频次而不触发淘汰。该方案在时间和空间复杂度上都达到最优,适合高频访问场景。

2025-10-26 08:00:00 539

原创 0146. LRU 缓存

本文介绍了两种实现LRU缓存的方法。第一种基于LinkedHashMap手动维护访问顺序:get操作通过移除并重新插入键值对来标记最近使用,put操作在容量满时移除最旧的条目。第二种更简洁,利用LinkedHashMap的accessOrder特性,重写removeEldestEntry方法自动淘汰最久未使用的条目。两种方法的时间复杂度均为O(1),空间复杂度为O(capacity)。代码展示了Java实现,适用于需要高效缓存管理的场景。

2025-10-26 07:00:00 581

原创 0707. 设计链表

本文介绍了如何设计一个支持常见操作的单链表结构。通过使用带哨兵头结点的单链表,可以统一插入和删除操作的逻辑处理。主要操作包括获取指定索引节点的值、在头部/尾部插入节点、在指定位置插入节点以及删除指定位置节点。代码实现中维护了链表大小size,用于边界检查,并通过遍历找到目标位置的前驱节点进行链接调整。所有操作的时间复杂度最坏为O(n),空间复杂度为O(1)。

2025-10-25 08:00:00 424

原创 1171. 从链表中删去总和值为零的连续节点

摘要 本文介绍了如何删除链表中所有连续节点之和为零的子序列。通过使用前缀和与哈希表,在两次遍历中解决问题:第一次记录每个前缀和最后一次出现的节点,第二次跳过这些区间以实现删除。算法时间复杂度O(n),空间复杂度O(n)。关键点包括使用虚拟头节点统一处理边界情况,以及确保删除最长零和段避免残留。

2025-10-25 07:00:00 510

原创 1019. 链表中的下一个更大节点

摘要: 题目要求对单链表每个节点,找到右侧第一个严格更大的节点值。解法采用反转链表+单调栈策略:先反转链表转为从左到右处理,使用单调递减栈维护候选更大值。遍历时弹出小于当前值的栈元素,栈顶即为目标值。时间复杂度O(n),空间复杂度O(n)。核心步骤包括链表反转、栈操作和结果回填。也可正向处理链表转为数组后应用标准单调栈解法。

2025-10-24 08:00:00 493

原创 0148. 排序链表

本文介绍了链表排序的归并排序实现。题目要求对单链表进行升序排序,时间复杂度为O(n log n),空间复杂度为常数。解题采用自顶向下的归并排序方法:使用快慢指针找到链表中点断开,递归排序左右两部分,再合并两个有序链表。代码通过java实现,核心步骤包括找中点、递归排序和合并操作。时间复杂度O(n log n),空间复杂度O(log n)来自递归栈。

2025-10-24 07:00:00 333

原创 1024 程序员万岁 . !

程序员的节日里,代码不仅是工具,更是思想的延伸。从深夜调试到项目上线,每一行代码都记录着坚持与成长。从Hello World到复杂系统,编程教会我们用逻辑搭建理想世界。致敬每一位用代码改变世界的追光者——让我们继续以键为笔,与代码共鸣前行。

2025-10-23 18:18:33 243

原创 0023. 合并 K 个升序链表

本文解决合并K个有序链表的问题,采用分治归并策略。算法将链表数组递归二分,分别合并后再两两合并。关键步骤包括处理空区间边界条件和实现两个链表的合并操作。时间复杂度为O(N log k),空间复杂度为递归栈的O(log k)。相比最小堆解法,分治实现更简洁高效。

2025-10-23 08:00:00 516

原创 0021. 合并两个有序链表

摘要: LeetCode题目要求合并两个非递减有序链表。解题思路采用迭代法,使用哑节点和指针逐个比较节点值,将较小值接入新链表。当某链表遍历完后,直接将剩余部分链接到末尾。时间复杂度O(n+m),空间复杂度O(1)。

2025-10-23 07:00:00 303

原创 0445. 两数相加 ii

题目要求将两个正序链表表示的数字相加,并返回正序结果链表。解题思路采用反转链表使低位对齐,相加后再反转回正序。具体实现包括反转链表、按位相加处理进位、最后反转结果。时间复杂度为O(n+m),空间复杂度O(1)。代码通过三次线性遍历完成操作,避免了栈等额外空间开销。

2025-10-22 00:30:00 391

原创 2816. 翻倍以链表形式表示的数字

本文解决链表表示的数字翻倍问题。通过反转链表使低位在前,便于逐位处理进位;完成数值翻倍后再反转恢复原序。算法时间复杂度O(n),空间复杂度O(1)。关键步骤包括链表反转、数值计算和结果重组,确保进位正确处理。

2025-10-22 00:30:00 597

原创 0002. 两数相加

LeetCode两数相加问题要求将两个逆序存储的非负整数链表相加,返回同样逆序的链表。解题采用递归方法逐位相加:计算当前位和与进位,递归处理下一位直至链表为空且无进位。代码简洁清晰,时间复杂度O(n+m),空间复杂度O(n+m)与结果链表长度相关。递归深度最多为结果位数,适用于合理长度的链表相加。

2025-10-21 08:00:00 453

原创 0160. 相交链表

摘要: 题目要求找出两个单链表相交的起始节点,若不相交则返回null。采用双指针法,指针pA和pB分别从链表A和B的头节点出发,遍历到末尾后切换到另一链表的头节点继续遍历。通过这种方式,两指针最终会同时到达相交点或null(不相交时)。该方法无需计算长度,时间复杂度O(n+m),空间复杂度O(1)。关键点是判断节点引用是否相同,而非节点值相等。

2025-10-21 07:00:00 278

原创 0328. 奇偶链表

该题要求将单链表的奇数索引节点和偶数索引节点分开重组,奇数节点在前,偶数节点在后。解题思路是使用两个指针oddList和evenList分别遍历奇数节点和偶数节点,将奇数节点和偶数节点各自串联成两条链,最后将奇数链的尾部连接到偶数链的头部即可。代码仅需一次遍历,时间复杂度为O(n),空间复杂度为O(1)。边界情况处理空链表或单节点链表时直接返回原链表。

2025-10-20 07:00:00 292

原创 0086. 分隔链表

本文介绍了链表分区问题的解法。给定一个单链表和整数x,需要将链表分成两部分:所有小于x的节点在前,其余节点在后,并保持原有顺序。解题思路是使用双虚拟头节点分别串联小于x和大于等于x的节点,通过一次遍历完成分区,最后将两个子链表拼接。该方法时间复杂度为O(n),仅使用常数空间。边界情况如空链表或全部分到一侧时也能正确处理。

2025-10-20 07:00:00 269

原创 0287. 寻找重复数

这道题要求找出数组中唯一的重复数字,且不能修改数组并使用O(1)额外空间。解题思路采用Floyd判环算法(龟兔赛跑法),将数组视为链表,重复数字导致链表成环。第一阶段通过快慢指针找到相遇点,第二阶段从头节点和相遇点同时出发,再次相遇即为环入口(重复数字)。算法时间复杂度O(n),空间复杂度O(1)。

2025-10-19 08:00:00 381

空空如也

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

TA关注的人

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