自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 RabbitMQ详解

RabbitMQ是一种基于AMQP协议的消息队列中间件,支持异步通信和多种消息路由模式。核心组件包括交换机(Direct、Fanout、Topic、Headers)、队列和绑定,用于灵活的消息路由。消息包含消息体、头、属性和路由键等结构。RabbitMQ适用于电商订单、日志处理、用户行为追踪等场景,Java可通过Spring Boot或原生客户端集成,配置连接工厂后即可使用。

2025-08-25 23:17:40 415

原创 力扣热题100-----142.环形链表

本文介绍了链表的基本概念、Java实现及常见操作。主要内容包括:链表与数组的对比,Java中LinkedList类和自定义节点类的实现;链表核心操作如插入、删除的代码示例;反转链表、检测环等常见算法问题;性能优化建议如使用虚拟头节点;以及LRU缓存、多项式运算等实际应用场景。重点展示了如何通过快慢指针法检测环并找到环的入口节点,提供了完整的Java解决方案。文章涵盖链表从基础到实践的关键知识点,适合开发者系统学习链表数据结构及其应用。

2025-08-19 22:11:53 436

原创 力扣热题100------19.删除链表的倒数第N个结点

本文介绍了如何删除链表倒数第n个节点的方法。使用双指针技术,先让快指针移动n+1步,然后同时移动快慢指针直到链表末尾,此时慢指针指向要删除节点的前驱节点。示例展示了删除不同位置节点的结果。Java实现通过创建虚拟头节点简化操作,最终返回修改后的链表头节点。时间复杂度为O(L),空间复杂度为O(1),其中L为链表长度。

2025-08-18 19:57:31 144

原创 力扣热题100-----32.最长有效括号

本文介绍了使用动态规划算法求解最长有效括号子串长度的问题。通过定义dp数组存储以每个字符结尾的最长有效括号长度,并分情况讨论状态转移:当遇到右括号时,若前一个字符是左括号则直接匹配,否则检查前一个匹配子串前的字符是否为左括号。算法时间复杂度O(n),空间复杂度O(n),高效解决了该问题。动态规划在此类具有重叠子问题和最优子结构特性的字符串匹配问题中表现出色,但需要注意状态转移方程的推导和空间消耗。

2025-08-17 21:43:12 873

原创 力扣热题100------416.分割等和子集

摘要:本文探讨了使用动态规划解决数组分割问题的算法。通过计算数组总和并判断其奇偶性,确定是否存在两个和相等的子集。采用动态规划方法,定义状态转移方程,利用一维数组存储中间结果,最终判断是否能找到和为目标值的子集。动态规划通过分解子问题、存储解避免重复计算,适用于具有最优子结构和重叠子问题特性的场景,在提高效率的同时也面临空间复杂度较高和状态方程推导复杂等局限性。该算法在解决类似背包问题时展现出高效性和可扩展性。

2025-08-16 21:14:55 903

原创 力扣热题100------152.乘积最大子数组

本文介绍了使用动态规划解决数组中最大乘积子数组的问题。通过定义maxProduct和minProduct数组分别存储以当前元素结尾的子数组的最大和最小乘积,利用状态转移方程maxProduct[i] = max(nums[i], maxProduct[i-1]*nums[i], minProduct[i-1]*nums[i])和minProduct[i]的对应最小值计算,最终得到全局最大乘积。动态规划通过分解问题、存储子问题解避免重复计算,适用于具有最优子结构的问题,虽然需要额外存储空间,但能显著提高效率。

2025-08-15 14:07:23 857

原创 力扣热题100-------300.最长递增子序列

本文介绍了使用动态规划解决最长递增子序列问题的方法。算法通过定义状态数组result[i]表示以nums[i]结尾的最长子序列长度,初始化各元素为1,然后通过双重循环比较元素并更新状态值。时间复杂度为O(n²),空间复杂度为O(n)。动态规划适用于具有重叠子问题和最优子结构特性的问题,能有效避免重复计算,但需要额外存储空间和推导状态转移方程。该解法直观展示了动态规划在序列问题中的应用。

2025-08-14 17:09:58 415

原创 力扣热题100-----139.单词拆分

摘要:本文介绍了一种基于动态规划的字符串拼接判定方法。给定字符串s和单词字典wordDict,通过动态规划判断s是否能由字典中的单词拼接而成。定义布尔数组a[i]表示前i个字符能否被拼接,初始化a[0]为true,通过双重循环检查所有可能的子串组合。该方法时间复杂度为O(n^2),空间复杂度为O(n)。动态规划通过分解问题、存储子问题解来提高效率,适用于具有最优子结构的问题,但需要注意空间消耗和状态转移方程的推导。最后给出了Java实现代码,展示了如何运用动态规划解决字符串拼接问题。

2025-08-13 19:18:45 560

原创 力扣热题100------279.完全平方数

本文介绍了利用动态规划求解"和为n的完全平方数的最少数量"问题。该问题要求找到将整数n表示为完全平方数之和所需的最少项数。通过定义dp数组存储中间结果,初始化dp[0]=0,其他为较大值,然后使用双重循环递推计算:外层遍历1到n,内层遍历可能的平方数,状态转移方程为dp[i]=min(dp[i], dp[i-j*j]+1)。最终dp[n]即为解。动态规划通过存储子问题解避免重复计算,适用于具有最优子结构的问题,但也存在空间复杂度较高、状态转移推导困难等局限。该问题展示了动态规划在组合优化

2025-08-12 20:07:52 891

原创 力扣热题100-----322.零钱兑换

本文介绍了使用动态规划解决硬币找零问题的方法。通过定义dp数组存储凑成每个金额所需的最少硬币数,初始化后从1到amount进行递推,对每个金额尝试使用所有硬币面值进行状态转移。该算法时间复杂度为O(n*m),空间复杂度为O(n)。动态规划适用于具有最优子结构的问题,能有效避免重复计算,但需要合理设计状态转移方程。对于无法凑出的金额返回-1,金额0返回0。该方法高效解决了最少硬币组合问题。

2025-08-11 22:02:35 551

原创 力扣热题100-------198.打家劫舍

本文介绍了使用动态规划解决房屋偷窃问题的方法。该问题要求在不能连续偷窃相邻房屋的限制下,计算能获得的最大金额。通过定义状态数组存储每个位置的最大金额,初始化前两个状态后,利用状态转移方程dp[i] = max(dp[i-1], dp[i-2] + nums[i])逐步求解。该方法时间复杂度O(n),空间复杂度O(n),高效地解决了问题。动态规划的适用性、局限性和核心概念(最优子结构、重叠子问题)也在文中得到简要说明。

2025-08-10 22:01:33 929

原创 力扣热题100-----118.杨辉三角

本文介绍了使用动态规划法生成杨辉三角的解决方案。动态规划通过分解问题为子问题并存储中间结果来提高效率。在杨辉三角中,每行数字由上一行相邻两个数字相加得到(首尾为1)。算法步骤包括:1)初始化第一行为[1];2)逐行生成,中间元素为上一行相邻元素之和;3)每行首尾添加1。该方法时间复杂度为O(n²),空间复杂度为O(n²),适用于具有重叠子问题特性的场景。动态规划的优势在于避免重复计算,但需要额外存储空间和正确推导状态转移方程。

2025-08-09 19:04:15 518

原创 力扣热题100------70.爬楼梯

动态规划(Dynamic Programming,简称 DP)是一种用于解决多阶段决策问题的算法思想,它通过将复杂问题分解为更简单的子问题,并存储这些子问题的解以避免重复计算,从而高效地解决问题。动态规划通常用于优化问题,尤其是那些具有重叠子问题和最优子结构特性的问题。动态规划是一种强大的算法思想,通过将复杂问题分解为更简单的子问题,并存储这些子问题的解,避免重复计算,从而高效地解决问题。爬楼梯问题是动态规划的经典应用之一,通过定义状态、初始化状态、状态转移和计算顺序,可以高效地求解问题。

2025-08-09 18:43:42 839

原创 力扣热题100------287.寻找重复数

摘要:给定一个长度为n+1的数组nums,其中元素范围在[1,n]内且仅有一个重复数字。要求在不修改数组且仅使用O(1)额外空间的情况下找出重复数字。解决方案利用数组元素的正负性标记:将每个元素对应的索引位置(元素值-1)的数字取反,当发现某个索引位置已被标记为负数时,即可确定该元素为重复数字。该方法时间复杂度O(n),空间复杂度O(1),但会修改原数组。

2025-08-08 18:51:21 215

原创 SpringBoot微头条实战项目

微头条是一个基于现代技术栈构建的新闻发布和浏览平台,旨在为用户提供便捷的新闻阅读体验和高效的新闻管理功能。该项目通过前后端分离的架构设计,实现了用户注册、登录、新闻浏览、搜索、发布、修改和删除等功能,同时通过JWT技术保证了用户认证的安全性和高效性。

2025-08-07 15:18:32 1210

原创 力扣热题100-------75.颜色分类

荷兰国旗算法是一种高效的三色排序方法。它通过维护三个指针(low、mid、high)将数组分为0、1、2三个区域:当nums[mid]为0时与low交换并移动指针;为1时跳过;为2时与high交换。该算法只需一次遍历,时间复杂度O(n),空间复杂度O(1),实现了原地排序。示例输入[2,0,2,1,1,0]经过处理后输出为[0,0,1,1,2,2]。

2025-08-06 20:51:24 200

原创 力扣热题100------136.只出现一次的数字

该问题要求在给定数组中找出唯一出现一次的数字(其他数字均出现两次)。利用异或运算的特性:相同数字异或结果为0,0与任何数异或结果为该数本身。因此,只需遍历数组,将所有数字依次异或,最终结果即为目标数字。该方法时间复杂度O(n),空间复杂度O(1)。示例代码展示了这一实现:初始化变量a=0,遍历数组执行异或操作,最后返回a的值即为解。该算法高效且满足题目要求。

2025-08-06 20:36:38 266

原创 力扣热题100-------169.多数元素

摘要:本文介绍了一种使用摩尔投票算法在O(n)时间复杂度和O(1)空间复杂度下寻找数组中多数元素的方法。该算法通过维护一个候选元素和计数器,遍历数组时若计数器为0则更新候选元素,遇到相同元素则计数器加1,否则减1。最终候选元素即为出现次数超过⌊n/2⌋的多数元素。示例代码展示了该算法的Java实现,适用于n≥1且保证存在多数元素的情况。

2025-08-05 19:33:24 336

原创 力扣热题100------21.合并两个有序链表

本文介绍了如何合并两个升序链表为一个新的升序链表。算法通过创建虚拟头结点和指针,比较两个链表当前节点的值,将较小值依次连接到新链表。当一个链表遍历完时,直接将剩余链表连接到末尾。该方法时间复杂度为O(n+m),空间复杂度O(1)。示例代码展示了Java实现,使用while循环处理非空链表,最后处理剩余节点。这是链表操作中的经典问题,体现了双指针技巧的应用。

2025-08-04 22:30:26 304

原创 力扣热题100----------141.环形链表

摘要: 本文介绍了如何判断链表是否存在环。使用快慢指针法,快指针每次移动两步,慢指针每次移动一步。如果存在环,两指针终会相遇;否则快指针会先到达链表末端。算法时间复杂度为O(n),空间复杂度为O(1)。示例展示了有环和无环链表的情况,Java代码实现了这一判断逻辑。这种方法高效且节省空间,是判断链表环的经典解决方案。

2025-08-03 18:58:17 377

原创 力扣热题100------234.回文链表

摘要: 判断单链表是否为回文链表,使用快慢指针找到中点,反转后半部分链表,然后比较前后两部分是否相同。具体步骤:1. 快指针每次移动两步,慢指针每次移动一步,找到中间节点;2. 反转后半部分链表;3. 逐个比较前半部分和反转后的后半部分节点值,全部相同则返回true,否则返回false。该方法时间复杂度为O(n),空间复杂度为O(1)。

2025-08-02 11:38:54 246

原创 力扣热题100---------206.反转链表

本文介绍了如何反转单链表。通过定义两个指针pre和cur,分别初始化为null和头节点head,使用while循环遍历链表。在每次循环中,先保存cur的下一个节点next,然后将cur.next指向pre,实现局部反转,接着移动pre和cur指针继续处理后续节点。最终返回pre作为新链表的头节点。该方法时间复杂度O(n),空间复杂度O(1),能高效完成链表反转任务。示例展示了输入[1,2,3,4,5]反转后输出[5,4,3,2,1]的情况。

2025-08-01 20:21:36 172

原创 力扣热题100--------160.相交链表

摘要: 题目要求找出两个无环单链表的相交起始节点,若不相交则返回null。采用双指针法,定义指针A和B分别遍历链表A和B。当指针到达链表末尾时,切换到另一链表的头部继续遍历。由于两指针走过的总长度相同,最终会在相交节点相遇(或同时到达null)。该方法时间复杂度O(m+n),空间复杂度O(1),保证了链表原始结构不被修改。例如,链表A=[4,1,8,4,5]和B=[5,6,1,8,4,5]会在节点8相交。若遍历结束未相遇,则返回null。

2025-08-01 20:05:51 540

原创 SSM整合实战案例

SSM整合项目简介 SSM整合是指将Spring、Spring MVC和MyBatis三大框架有机结合,构建一个完整的Java Web应用。项目采用分层的IoC容器设计,包含web容器(管理Controller层)和root容器(管理Service和DAO层),通过父子容器关系实现组件依赖注入。 核心配置包括: WebJavaConfig - 配置Controller和Spring MVC组件 ServiceJavaConfig - 配置Service层和事务管理 MapperJavaConfig - 配置

2025-08-01 06:18:42 448

原创 SpringMVC详解

SpringMVC 的基本概念及其在 Java Web 开发中的作用Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块的名称(),但它通常被称为“Spring MVC”。在控制层框架历经Strust、WebWork、Strust2等诸多产品的历代更迭之后,目前业界普遍选择了SpringMVC作为Java EE项目表述层开发的首选方案。Spring 家族原生产品。

2025-07-31 22:41:00 1261

原创 力扣热题100---------153.寻找旋转排序数组中的最小值

摘要:本文研究旋转有序数组中寻找最小元素的问题。给定一个互不相同的升序数组经过1到n次旋转后的结果,要求设计时间复杂度为O(log n)的算法。通过二分查找,比较中间元素与右边界元素的大小关系:若中间元素较大,则最小值在右侧区间;否则在左侧区间。最终返回左边界元素即为最小值。该算法高效地解决了在旋转数组中定位最小元素的问题。

2025-07-31 21:20:26 281

原创 力扣热题100---------33.搜索旋转排序数组

在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2]。输入:nums = [4,5,6,7,0,1,2], target = 0。输入:nums = [4,5,6,7,0,1,2], target = 3。

2025-07-31 20:59:29 287

原创 力扣热题100--------34.在排序数组中查找元素的第一个位置和最后一个位置

题目要求在有序数组中查找目标值的起始和结束位置,若不存在则返回[-1,-1]。摘要:该问题通过二分查找实现,首先定位目标值,然后向左右扩展确定边界。算法时间复杂度为O(log n),满足题目要求。示例展示了不同输入情况下的输出结果,包括目标值存在和不存在的情形。Java实现通过二分查找定位目标后,检查相邻元素以确定完整范围。

2025-07-30 22:41:41 299

原创 力扣热题100-------74.搜索二维矩阵

给定一个满足特定条件的二维矩阵(行内元素递增且每行首元素大于前一行末元素),要求判断目标值是否存在。该问题可以通过高效的搜索算法解决。给出的Java解法采用从矩阵右上角开始的搜索策略:若目标值小于当前元素则左移列,大于则下移行,直至找到目标或遍历完矩阵。这种方法的时间复杂度为O(m+n),空间复杂度为O(1),适用于给定的矩阵特性。例如,对于矩阵[[1,3,5,7],[10,11,16,20],[23,30,34,60]],可以正确判断目标值3存在而13不存在。

2025-07-30 22:13:50 307

原创 力扣热题100---------35.搜索插入为位置

该文介绍了在有序数组中查找目标值或确定其应插入位置的问题。通过二分查找算法实现O(log n)时间复杂度,具体步骤为:初始化左右指针,计算中间位置,比较目标值与中间值调整搜索范围,直到找到目标值或确定插入位置。示例代码展示了该算法的Java实现,当循环结束时未找到目标值,则左指针即为应插入位置。该解法高效且简洁,适用于有序无重复元素的数组。

2025-07-30 21:52:55 149

原创 力扣热题100--------240.搜索二维矩阵

摘要:本文提出了一种在特殊有序矩阵中高效搜索目标值的算法。该矩阵每行从左到右升序,每列从上到下升序。算法从矩阵右上角开始,若当前值小于目标则下移一行,大于目标则左移一列,直到找到目标或越界。时间复杂度为O(m+n),空间复杂度O(1)。示例验证了算法在查找存在值(如5)时返回true,不存在值(如20)时返回false。该解法充分利用了矩阵的双向有序特性,实现了高效的搜索。

2025-07-29 23:28:47 257

原创 力扣热题100--------48.旋转图像

本文介绍了一种原地顺时针旋转N×N矩阵90度的方法。算法分为两步:首先沿主对角线进行转置(交换上三角和下三角元素),然后逐行进行水平翻转(交换每行的首尾元素)。该方法时间复杂度为O(N²),空间复杂度为O(1),满足原地修改的要求。示例代码展示了Java实现,通过两次嵌套循环分别完成转置和翻转操作,最终实现矩阵的顺时针旋转效果。

2025-07-29 22:43:44 436

原创 力扣热题100-------54. 螺旋矩阵

本文介绍了按顺时针螺旋顺序遍历矩阵的算法。通过定义矩阵的边界(起始行、结束行、起始列、结束列),在while循环中依次执行从左到右、从上到下、从右到左、从下到上的遍历。每次遍历后调整相应边界,直到所有元素被访问。该算法时间复杂度为O(mn),空间复杂度为O(1)。

2025-07-28 23:09:29 319

原创 力扣热题100----------73. 矩阵置零

本文提出了一种原地算法来解决矩阵置零问题。当矩阵元素为0时,需要将其所在行和列全部置零。算法核心思想是:首先遍历矩阵,用第一行和第一列标记需要置零的行和列,并用两个布尔变量记录第一行和第一列自身是否需要置零。然后再次遍历矩阵,根据标记将对应行和列置零。最后处理第一行和第一列的特殊情况。这种方法避免了使用额外空间,实现了O(1)空间复杂度的解决方案,同时保持时间复杂度为O(mn)。

2025-07-28 22:32:27 218

原创 Spring声明式事物详解

摘要: Spring框架提供编程式和声明式两种事务管理方式。编程式事务通过代码显式控制事务边界(如JDBC Connection或PlatformTransactionManager),灵活性高但增加代码复杂度;声明式事务通过注解(如@Transactional)或配置实现,与业务解耦但灵活性受限。两者核心区别在于管理方式(手动vs自动)、代码侵入性、灵活性及应用场景。Spring事务管理器(如DataSourceTransactionManager)提供统一接口,支持多种持久层技术。声明式事务依赖spri

2025-07-28 04:25:23 1348

原创 力扣热题100----------41.缺少的第一个正数

本文提出了一种时间复杂度为O(n)且空间复杂度为O(1)的算法,用于在未排序整数数组中找到缺失的最小正整数。算法分三步:首先将非正数和大于n的数替换为n+1;然后遍历数组,将存在的正数对应的索引位置标记为负数;最后再次遍历,找到第一个正数位置即为缺失的最小正整数。该方法巧妙利用原数组作为哈希表,通过数值与索引的对应关系进行标记,无需额外空间。示例验证了算法的正确性,Java实现代码完整展示了这一过程。

2025-07-27 23:36:21 486

原创 力扣热题100---------56. 合并区间

这篇文章介绍了一种合并重叠区间的算法。首先对区间数组按起始点排序,然后遍历处理每个区间。使用一个列表存储合并结果,当前区间与前一个合并区间比较:如果存在重叠,则扩展合并区间的结束点;否则将当前区间加入结果列表。最终返回合并后的不重叠区间数组。该算法时间复杂度主要取决于排序步骤,为O(nlogn),空间复杂度为O(n)用于存储结果。示例演示了如何将[[1,3],[2,6]]合并为[1,6],以及[[1,4],[4,5]]合并为[1,5]的情况。

2025-07-27 23:12:09 176

原创 力扣热题100----------53最大子数组和

摘要:本文介绍了一个求解最大子数组和问题的算法。给定一个整数数组,要求找出和最大的连续子数组。示例展示了不同输入对应的输出结果。算法采用动态规划思想,遍历数组时维护当前子数组和:若当前和为负则重新开始累加,否则继续累加。同时始终记录最大值。该算法时间复杂度为O(n),空间复杂度O(1),能高效处理长度达10^5的数组。Java实现代码清晰地展示了这一过程。

2025-07-27 22:16:32 475

原创 力扣----------20有效的括号

摘要:该算法用于判断只包含括号的字符串是否有效。采用栈结构处理,遇到左括号入栈,遇到右括号时检查栈顶是否匹配。若不匹配或栈为空则返回false,匹配则弹出栈顶元素。最终栈为空则返回true。示例显示其对多种括号组合的有效性判断正确,时间复杂度为O(n)。Java实现通过遍历字符串和栈操作完成验证。

2025-07-26 22:50:56 125

原创 力扣---------238. 除自身以外数组的乘积

本文提出了一种不使用除法计算数组元素前缀和后缀乘积的方法。通过两次遍历数组,分别计算每个元素左侧和右侧所有元素的乘积,最后将左右乘积相乘得到最终结果。该方法时间复杂度为O(n),空间复杂度为O(n)。示例展示了如何计算[1,2,3,4]的结果为[24,12,8,6]。该方法避免了除法运算,适用于包含零元素的数组,且满足题目要求的32位整数范围限制。

2025-07-26 21:46:13 306

空空如也

空空如也

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

TA关注的人

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