自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 秒懂HTTP协议

HTTP 协议就是一套浏览器和服务器“说话”的规则,帮助你访问网页、发送数据、拿到结果。如果你想继续深入,比如学习抓包工具(如 Fiddler、浏览器的开发者工具),或者如何写一个简单的网页/服务器,也可以告诉我,我们一步一步来~你现在最感兴趣的是哪一部分?😄。

2025-04-10 21:45:51 193

原创 LeetCode 相交链表题解:双指针的精妙应用

⚠️ 注意:题目中所说的「相交」,指的是节点地址相同,而非节点值相同。两个链表在节点值为 8 的位置相交(当然我们比较的是节点地址)。当其中一个到达链表尾部时,跳到另一个链表的头部继续走;:O(m + n),m 和 n 分别为两个链表的长度;如果两个链表有交点,最终它们会在交点相遇;:O(1),只用了两个指针,无需额外空间。如果没有交点,两个指针都会在走完。如果两个链表没有交点,返回。两个指针开始分别走各自的链表;,请你找出并返回它们的。

2025-04-09 19:48:22 233

原创 从零开始彻底掌握二叉树(Java版详解 + 图解 + 面试题)

在程序设计中,二叉树(Binary Tree)是每个节点最多拥有两个子节点(通常称为“左子节点”和“右子节点”)的一种树形数据结构。其天然结构递归性极强,因此广泛应用于算法设计、表达式解析、搜索优化等领域。在 Java 中,二叉树通常以链式结构存在,每个节点是一个对象,其左右子树由两个引用指向。int val;// 存储的数据// 指向左子树// 指向右子树二叉树是一个“值得反复练习”的基础模块。它让我们更深入理解递归、栈、搜索、分治等核心思想,也在面试中频频出现,是写出漂亮代码的基石。

2025-04-08 14:50:46 535

原创 一文搞懂 Dijkstra 算法:最短路径的经典之选(含 Java 代码详解)

Dijkstra 算法适用于边权非负的有向图或无向图;通过优先队列可以将时间复杂度降为;实现时要注意下标从 0 开始,避免越界;常用于图论入门、路径优化、交通网络等场景。

2025-04-05 18:06:45 1041

原创 【Leetcode 994】腐烂的橘子 - 多源 BFS 解题思路与 Java 实现详解

这道题作为 BFS 的经典题目,锻炼了你对于:多源 BFS 的理解;BFS 分层处理(每一层表示时间);细节边界判断(新鲜橘子统计、flag 控制时间);的全面掌握。掌握之后,你可以轻松应对更多类似题目,比如:火焰蔓延问题岛屿感染问题最短路径带时间传染传播更多图解题解,欢迎关注我!

2025-04-05 10:56:11 349

原创 Floyd 算法 Java

Floyd-Warshall 是处理稠密图、所有点对路径问题的强力工具,使用简单,效率可接受。

2025-04-04 21:01:30 306

原创 Java 实现 字母异位词分组

本文详细解析了字母异位词分组问题,并使用排序 + 哈希表进行求解。时间复杂度为。通过字符计数法,可以进一步优化到O(NK)。这是一道典型的哈希表应用题目,考察了字符串处理和数据结构的使用。希望本文能帮助你更好地理解该问题!如果有任何疑问或优化建议,欢迎交流讨论!🎯。

2025-04-03 23:36:52 427

原创 深入解析力扣39.组合总和:回溯算法的妙用

给定一个无重复元素的数组candidates和一个目标值target,找出candidates中所有可以使数字和为target的组合。数组中的数字可以被重复使用。

2025-04-01 23:44:22 573

原创 LeetCode 78.子集

递归枚举所有可能的子集。先将。

2025-03-31 23:16:25 326

原创 1.两数之和(Java)

力扣Hot100 两数之和

2025-03-30 23:55:13 249

原创 广度优先搜索(BFS)

(BFS)是一种图的遍历算法。它从起点出发,首先访问距离起点最近的所有节点,然后逐层扩展到更远的节点,直到目标节点被找到,或者图中没有更多可访问的节点。与。

2025-02-11 00:46:09 894

原创 滑动窗口算法

滑动窗口(Sliding Window)算法:一种高效的子数组/子串问题解法

2025-02-09 22:59:21 969

原创 差分算法解析

差分算法的解析以及代码实现

2025-02-08 18:35:10 791

原创 双指针算法深度解析

双指针算法剖析,以及经典双指针题目

2025-02-04 10:34:52 639

原创 二维前缀和:高效求解矩阵区域和问题

在处理二维矩阵时,频繁计算某一子矩阵的和是一个常见的操作。通过上述方式构造的二维前缀和数组,可以快速计算任意子矩阵的元素和。的所有矩阵元素的和。通过构造这个前缀和数组,我们能够在常数时间内查询任意子矩阵的元素和。本文将通过一个具体的 Java 实现,介绍如何使用二维前缀和优化子矩阵求和问题。这样通过累加计算每个位置的前缀和,最终可以在常数时间内求出任意子矩阵的和。二维前缀和的思想类似,它在二维矩阵上扩展了前缀和的概念。的数组,额外的行和列用于处理边界问题。通过前缀和的计算公式,能够在常数时间内返回结果。

2025-02-03 17:20:23 710

原创 搜索旋转排序数组(二分查找)

如果左右边界相等则无法判断哪一部分有序(若数组元素有序则无需做此判断,详见搜索旋转排序数组2),此时l++,r--移动左右边界;不同的是,在旋转数组中,数组的两端(左端和右端)可能并非严格按顺序排列,这就要求我们在判断目标值和区间时多加小心。假设我们有一个旋转排序的数组,这个数组本身是一个升序数组,但是由于某种原因,它被旋转了一定的次数。这个旋转数组的特点是数组的前部分是递增的,后部分也是递增的,且存在一个旋转点使得数组的递增顺序断裂。通过这个特性,我们可以修改标准的二分查找算法来适应旋转排序数组的查找。

2025-02-01 19:10:56 855

原创 字符串反转

反转字符串的经典方法之一是使用“双指针”技术。双指针是指同时使用两个指针,从两端向中间靠拢,逐步交换指针所指向的元素,直到两个指针相遇。给定一个字符数组,任务是将其原地反转。也就是说,我们要修改原始数组,而不是创建一个新的数组。通过这个过程,我们可以实现原地反转字符串。

2025-01-31 21:20:12 370 1

原创 深度优先搜索(DFS)算法模板

深度优先搜索(DFS,Depth-First Search)是一种用于遍历或搜索树或图的算法。DFS 从起始节点开始,尽可能深入每一条分支,直到无法继续为止。然后回溯到上一个节点,继续未访问的其他分支,直到所有节点都被访问过。通过一个问题来讲解 DFS 的应用。问题要求我们计算一个二维矩阵中所有连通的“岛屿”数量,岛屿由1组成,水域由0组成。每个岛屿由若干相邻的1连接构成,可以上下左右相邻。

2025-01-30 23:18:05 428

原创 深度优先搜索(DFS)

DFS 是一种经典的图遍历算法,适用于搜索图中的路径、连通性检测等问题。我们在本文中通过 Java 代码展示了如何实现一个深度优先搜索,并解释了 DFS 的工作原理与流程。通过递归方式实现,DFS 对于图的搜索非常高效,尤其在需要深入到图的某一分支时尤为有用。// 最大节点数// 读取顶点数// 图的邻接矩阵// 读取边数// 构建图的邻接矩阵i < m;i++) {// 起点// 终点// 设置邻接矩阵// 输出邻接矩阵i <= n;

2025-01-30 15:37:34 776

原创 力扣219.存在重复元素每日一题(大年初一)

以一道简单题开启全新的一年我们可以使用来存储数组元素及其对应的索引。通过遍历数组,我们可以检查当前元素是否已经存在于哈希表中,并判断索引差是否满足条件。创建一个哈希表map,用于存储数组元素及其对应的索引。遍历数组nums,对于每个元素nums[i]检查哈希表中是否已经存在该元素。如果存在,且当前索引与哈希表中存储的索引差不超过k,则返回true。如果不存在,则将当前元素及其索引存入哈希表。如果遍历结束后仍未找到满足条件的索引对,则返回false。

2025-01-29 10:08:19 161

原创 三傻排序的比较(选择,冒泡,插入)

排序算法时间复杂度(最坏/平均/最好)空间复杂度稳定性总结选择排序O(1)不稳定选择排序就像每次去找最小的苹果,把它拿过来放到最前面。比较次数多,但并不保证相同值的苹果顺序不变。冒泡排序O(1)稳定冒泡排序就像水中泡泡,每次拿两个相邻的元素交换位置,把最大的“泡泡”挤到最后面。对已经排序的部分有点帮助。插入排序O(1)稳定插入排序像扑克牌,每次从剩下的牌中选一张,插入到已经排好序的部分。只要原本部分已经排得差不多,插入排序就很快。选择排序。

2025-01-27 20:52:00 1620

原创 归并排序(Java)

这个过程一直进行,直到每个子数组的长度为1,这时它们已经是有序的了(因为只有一个元素)。// 基本情况:只有一个元素时无需排序。这个数组的大小和原始数组相同,因此空间复杂度为。注:需要注意merge中最后将辅助数组赋值回arr数组的边界问题。将两个有序的子数组合并成一个有序数组。的,即 O(n),其中 n 是两个子数组的总长度。// 将排序好的部分复制回原数组。// 复制剩余的左边部分。// 复制剩余的右边部分。// 合并左右两部分。,其中 n 是数组的长度。归并排序的空间复杂度是。归并排序的核心思想是。

2025-01-26 22:38:58 681 1

原创 合并两个有序链表----Java

链接力扣 21.合并两个有序链表。

2024-11-07 16:01:40 179

原创 LCR 123.图书管理I---Java

本题如下且返回值为数组:代码如下:

2024-08-26 20:21:08 426

原创 删除字符串中的所有相邻项---(Java)

代码如下:

2024-08-26 18:30:00 477

原创 回文链表---Java

借助一个栈来判断链表是否为回文链表

2024-08-25 15:31:06 264

原创 LeetCode---739.每日温度(Java)

大体思路:此题使用一个栈来找到每个温度之后第一个更高的温度与其之间的天数差(以索引差表示)

2024-08-23 23:17:11 372 1

原创 括号的最大嵌套深度---(C++)

遇到左括号栈的大小+1(进栈),遇到一个右括号则说明与一个左括号进行了匹配,栈的大小-1(出栈),则此时还有size-1个左括号,则字符串后一定还有size-1个右括号要与这size-1个左括号匹配,若再无左括号,嵌套深度就为栈大小的最大值,若还有左括号,则还会有右括号与之匹配,因此这就是使用max的原因。遍历字符串,遇到左括号(,栈的大小+1(进栈),遇到右括号),栈的大小-1(出栈)。此题直接给定有效括号,则其所有输入的括号均为有效括号,括号题一般都可用数据结构---栈 来处理。

2024-04-17 22:06:41 381 1

原创 有效的括号(栈)

链接力扣题目20.

2024-04-16 10:56:12 703

原创 移除链表元素(C++)

链接题目力扣203以下介绍两种方法,分别为迭代法和递归法。

2024-04-14 13:10:04 567 1

原创 二刷反转链表(c++)

4.最后返回值设置成了右指针,完成循环后此时右指针指向应为空,而此时左指针指向的为新链表的第一个结点。二刷这道题使用了掌握良好的双指针法,虽然思路还在,但代码还是零零星星的有问题。2.设置好临时指针后又忘记了临时指针也要放到循环里面参与遍历。二刷虽然效果不好,但发现了很多问题,也对此题更熟练了!半个月没有刷题,生疏了好多,从今天起一天至少一道!1.忘记设置一个临时指针来指向右指针的下一个结点。3.完全忘了左指针如何设置。

2024-04-13 22:14:05 156

原创 数据结构-栈(c++)

本文介绍用顺序表实现栈的代码:栈是一种线性表,具有先进后出的特点,可以将栈类比为叠盘子或一层一层的包子蒸笼,在实际应用中体现在网页的前进后退等方面。

2024-03-28 18:51:05 329

原创 被ai整怕了

找了半天没有发现这个问题,文心ai直接秒了,真的是被ai整的汗流浃背了。

2024-03-21 18:45:00 231 1

原创 LCR.191(剑指offer66-C++)

使用两个数组L和R且两数组元素均为1,L[i]表示a[i]左边的乘积,而。最后正向遍历相乘,result[i]=L[i]= L[i]×R[i];另外,当i=0时,第一次正向遍历并没有包含i=0,L[0]=1。R[i]表示a[i]右边的乘积,那么L和R对应位置的。反向遍历,R[j]=R[j+1]×a[j+1];正向遍历,L[i]=L[i-1]×a[i-1];

2024-03-13 23:27:02 168

原创 LCR.139(剑指offer21-C++)

大体思路:初始化两个指针i和j,分别指向数组的第一个元素和最后一个元素。因为要将奇数放到偶数前,则指针i从左往右找偶数,指针从右往左找奇数,两指针找到后交换位置。

2024-03-13 22:54:07 308

原创 LeetCode160.相交链表(C++)

具体实现:需要指针A、B同时遍历各自所指向的链表,并用到三目运算符,当A、B指针不指向为空指针,便移动到下一个结点;当为空时,A移动headB,B移动到headA。若存在交点两指针通过遍历两个链表必回指向所相交的结点,最后返回这个结点。大体思路:定义两个指针A、B,分别初始化为链表A的和链表B的头结点,当A=B(两指针)所指向的相等时,则为相交的结点。如果相互有交点,走过你来时的路,我们终会相遇!

2024-03-11 23:35:08 154 1

原创 反转链表(C++)

再将第四个结点所指向的第五个结点为空(第19行代码),这便实现了第五个和第四个链表的反转,返回cur,还会再找调度head为4的时候,即head为3,再反转依此类推,便实现了链表反转,而cur指向了反转链表后的头结点。第18行代码,head-﹥next->next表示为第四个结点的next指针域所指向的结点指针域(即为第五个结点的next指针域所指向的)为等号右边head,此时head为4,则意味着第五个结点指向了第四个结点。首先,定义两个指针,cur指针指向头结点,mi指针初始化为NULL。

2024-03-10 09:13:35 1045 1

原创 第k个链表元素(C++)

输出第k个元素需用到k自减循环,在嵌套选择结构,判断cur指针指向的结点是否为空结点。若不是则cur指针移动到cur指针所指向的next指针域所指向的元素(将cur移动到指向下一个结点);因为要循环k次,最后一次循环结束时,cur指向的结点即为第k个结点。>输出的k可能会超过链表或为0,即cur指针会指向NULL或虚拟头结点,则输出超出范围(此处输出内容欠妥)否则输出当前指针指向的val值。输入n,k,构建一个长度为n的链表,并且输出第k个链表元素。基本思路:先构建链表,输出第k个元素需用到循环。

2024-03-09 15:28:41 558 1

原创 链表基础知识1(C++)

首先创建一个新结点,初始化值为val,使用一个cur指针,且cur指针指向链表的尾结点,将cur指向结点的next指针域指向新的结点,最后移动cur指针,指向新插入的结点。到此,cur指针指向新插入的尾结点。>链表的第一个结点的存储位置被称为头指针,通过next指针域找到下一个结点,直到找到最后一个结点,最后一个结点的next指针域为空指针,用null表示这个空指针。>为方便链表操作,会在链表第一个结点前添加一个虚拟头结点(dummyNode),此节点数据域为空,指针域指向第一个结点。

2024-03-08 19:59:22 272 1

原创 LeetCode.203.移除链表元素

代码主体先循环直到最后结点,当遇到所需删除元素,进行链表删除操作,还需删除结点内存。例如删除结点p后续结点:p->next = p->next->next;当第一个结点为所需移除链表元素时,添加虚拟头结点会更好处理。对于c++而言还需手动释放内存空间。记录第一次分享力扣题解思路。算法知识:链表元素的删除。

2024-03-08 00:28:29 201 1

空空如也

空空如也

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

TA关注的人

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