- 博客(66)
- 收藏
- 关注
原创 LeetCode 977. 有序数组的平方(双指针法)多语言实现
本题可以通过双指针法实现 O(n) 时间复杂度的解决方案 [[3]][[8]]。利用双指针从数组两端向中间遍历,比较两端元素平方的大小,将较大的值逆序填入结果数组 [[8]][[10]]。该方法充分利用了原数组的有序性,避免了平方后重新排序的 O(n log n) 时间复杂度,实现了线性时间复杂度的最优解 [[6]][[9]]。链接:https://leetcode.cn/problems/squares-of-a-sorted-array/
2025-03-27 23:44:24
188
原创 27. 移除元素【数组专题】Java\Python\JS\Go\C++
三轮遍历:slow=1,fast=2、num[fast]=2 不等于目标值 num[slow] = 2 新数组中元素[2,2] slow = 2。二轮遍历:slow=0,fast=1、num[fast]=2 不等于目标值 num[slow] = 2 新数组中元素[2] slow = 1。解释:你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。输入:nums = [0,1,2,2,3,0,4,2], val = 2。输出:5, nums = [0,1,4,0,3,
2025-03-26 23:42:35
559
原创 深度优先搜索(DFS)详解
深度优先搜索(Depth-First Search,DFS)是图论与树结构遍历中的核心算法之一,其核心思想是**“一条路走到黑,不撞南墙不回头”**。本文将从基础概念、算法原理、实现方式、应用场景及代码示例等角度全面解析DFS,并对比广度优先搜索(BFS),帮助读者掌握这一经典算法。DFS是一种用于遍历或搜索树、图的算法,其核心是优先探索当前路径的最深节点,直到无法继续为止,再通过回溯尝试其他路径[[2]][[10]]。例如,在迷宫问题中,DFS会选择一个方向持续深入,若遇到死胡同则退回上一个岔路口,换一个
2025-03-22 18:21:18
299
原创 图的理论基础
图是由顶点集合 ( V ) 和边集合 ( E ) 组成的二元组 ( G=(V,E) )。顶点代表实体,边表示实体间的关系。无向图:边无方向,如社交网络中的好友关系。有向图:边有方向,如网页链接关系。带权图:边或顶点附加权重,如交通网络中的距离[[8]]。图论通过抽象复杂关系为数学模型,为实际问题提供了高效的解决方案。随着大数据与人工智能的发展,图神经网络(GNN)等新兴技术进一步拓展了图论的应用边界[[4]][[6]]。未来,动态图处理、超大规模图算法优化仍将是研究热点。参考文献。
2025-03-21 07:26:20
685
原创 力扣 797. 所有可能的路径 解析JS、Java、python、Go、c++
该问题展示了DFS在图遍历中的典型应用。通过维护路径栈实现回溯,可以高效地遍历所有可能路径。Go/Python需要显式复制路径切片JavaScript通过闭包简化参数传递C++使用vector引用传递提升效率[[4]][[9]]参考:[[1]][[2]][[5]][[7]]
2025-03-19 23:59:01
763
原创 Dubbo 深度解析
随着互联网业务规模扩大,单体架构面临以下挑战:Dubbo 通过服务化拆分解决这些问题,其核心设计目标包括:3.2 服务提供者实现3.2.1 接口定义3.2.2 服务实现3.2.3 配置文件(application.properties)3.3 服务消费者实现3.3.1 引用服务3.3.2 配置文件3.4 高级配置示例3.4.1 多注册中心配置3.4.2 异步调用四、服务治理与性能优化4.1 负载均衡策略Random(默认):按权重随机选择服务实例。Round
2025-03-17 22:14:34
816
原创 Spring源码解析
ApplicationContext的扩展功能 ,主要来自 继承的四个接口。ApplicationContext 间接继承了BeanFactory。他的实现类-DefaultListableBeanFactory。所有单例bean:singletonObjects。获取到所有单例bean。
2025-03-17 22:05:55
301
原创 704. 二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。输入: nums = [-1,0,3,5,9,12], target = 9。输入: nums = [-1,0,3,5,9,12], target = 2。nums 的每个元素都将在 [-9999, 9999]之间。解释: 9 出现在 nums 中并且下标为 4。解释: 2 不存在 nums 中因此返回 -1。
2025-03-03 22:47:48
306
原创 Spring AOP源码探险:从“切面特工”到“动态代理暗战”
想象一下,你是一个特工组织的指挥官,需要在目标人物(业务逻辑)的日常生活中,悄无声息地插入监控设备(日志)、安防陷阱(事务)甚至“替身演员”(缓存)。而Spring AOP就是你手中的**“特工调度系统”**,它能让你在不修改目标代码的前提下,完成这些“秘密任务”。今天我们将深入Spring AOP的源码,揭开它的“间谍装备库”和“行动路线图”。这场“暗战”的胜负决定了你的切面是否能成功潜入目标。时,不妨想象一下背后的“特工小队”正在为你的代码保驾护航!,它是AOP的“总调度中心”。时,Spring通过。
2025-02-28 07:43:16
688
原创 【力扣Hot100】11. 盛最多水的容器
每次移动较矮的指针,可以确保不会错过更大的面积。因为容器的容量受限于较矮的一边,移动较高的指针无法增加容量,而移动较矮的指针可能找到更高的边界。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i])。解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。每次移动较矮的指针,计算当前面积并更新最大值。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。输入:[1,8,6,2,5,4,8,3,7]输入:height = [1,1]
2025-02-28 07:39:09
254
原创 安装Maven配置阿里云地址 详细教程
下面以安装Maven公认最稳定版本(使用最多)3.6.1为例1、访问maven官网直接跳转Maven3.6.12、点击下载跳转页面后继续单击 Maven 3 archives下载后解压放到自己的软件目录下 ~
2025-02-27 21:20:47
568
原创 【力扣Hot100】128. 最长连续序列:哈希集合高效解法
(即不存在比它小1的元素)。若是左边界,则向右扩展,统计连续序列的长度。此方法确保每个元素最多被访问两次,时间复杂度为。通过哈希集合的巧妙运用,能够高效解决最长连续序列问题。不同语言的实现均遵循同一逻辑,确保了算法的高效性和一致性。核心思路是利用哈希集合存储所有元素,遍历每个元素时,,找出其中最长连续子序列的长度。给定一个未排序的整数数组。解释:最长连续序列是。
2025-02-24 07:40:38
266
原创 【力扣Hot100详解】解锁“字母异位词分组”:用排序魔法一键通关力扣!
字母异位词分组找到同一类元素的唯一标识(排序后的字符串)。哈希表的灵活运用,将分类问题转化为键值映射。掌握这道题,你不仅学会了如何“归类数据”,更重要的是理解了**“空间换时间”**这一经典算法思想。下次遇到类似问题(如分组、去重),不妨想想:能不能造一个“魔法键”来一键解决?
2025-02-18 07:33:31
269
原创 【力扣Hot100详解】解密“两数之和”:用Java开启你的算法之旅!
空间换时间。通过使用哈希表,我们可以将时间复杂度从 O(n²) 降低到 O(n),大大提高了算法的效率。无论你是刚开始刷题,还是想巩固基础,这道题都是一个绝佳的起点。掌握了它,你就迈出了征服力扣的第一步!
2025-02-17 07:45:04
297
原创 jdk同时安装多个版本并自由切换(windows11版)全网最详细教程
请务必到以下位置删除这两个文件夹(这个很重要,不然后面可能切换不了版本),下面两个目录哪个有就删除哪个,都有就都删除。Oracle官网需要登陆才下载,点击下载后会弹出登录弹窗,(注意Oracle官网访问偏慢属正常现象)本次 操作会同时安装jdk1.8、jdk11、jdk17、jdk21四个版本,并实现自由切换。依次打开安装、安装目录可自定义,博主安装默认位置进行的安装,下面是下载后的四个版本。将上面提到的第一个JAVA_HOME的值修改为 %JAVA11_HOME%本次我们下载上文提到的4个版本。
2025-02-16 10:43:50
655
原创 史上最详细Spring IOC源码解析(Spring Framework 5.3.x)
Spring IOC容器的本质是一个管理POJO对象生命周期的工厂系统,其核心实现位于和包。本节将深入分析和两大核心接口的源码差异。1.1 BeanFactory源码层级// 核心方法定义(部分)// 层级关系:通过HierarchicalBeanFactory实现父子容器关键实现类的类继承关系:1.2 ApplicationContext的增强通过组合模式集成多个功能接口:// 扩展方法如getEnvironment(), publishEvent()等典型实现类:基础容器。
2025-02-13 22:23:45
653
原创 源码探秘:IOC容器是如何“偷偷”帮你打工的?——一个Java码农的深夜吐槽
当我们深入源码才发现,IOC容器就像个勤劳的外卖小哥:你不用关心对象怎么来(就像不用管外卖怎么做的)不用管理对象的关系(就像不用管外卖路线)只要喊一声"@Autowired",想要的对象就到碗里来!最后友情提示:虽然IOC让我们可以"躺平开发",但千万别在简历上写"精通Spring源码"——除非你真的读过BeanFactory的6000行源码!
2025-02-12 21:50:25
846
原创 详解线程唤醒和阻塞的常用方法
两个方法搭配使用,wait()使线程进入阻塞状态,调用notify()时,线程进入可执行状态。wait()内可加或不加参数,加参数时是以毫秒为单位,当到了指定时间或调用notify()方法时,进入可执行状态。(属于Object类,而不属于Thread类,wait()会先释放锁,再执行等待的动作。由于wait()所等待的对象必须先锁住,因此,它只能用在同步化程序段或者同步化方法内,否则,会抛出异常IllegalMonitorStateException.)
2024-11-23 15:10:28
254
原创 【玩转动态规划专题-01背包】416. 分割等和子集【中等】
给你一个 只包含正整数 的 非空 数组 nums。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。如果使用一维dp数组,物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒序遍历!解释:数组可以分割成 [1, 5, 5] 和 [11]。解释:数组不能分割成两个元素和相等的子集。输入:nums = [1,5,11,5]输入:nums = [1,2,3,5]
2024-11-21 07:38:36
274
原创 idea中 Maven lifecycle 和 plugins的区别
IDEA 主界面右侧 Maven 标签栏有同样的命令,比如 install,既在 Plugins 中存在,也在 Lifecycle中存在,到底选哪个?二者又有什么区别呢?
2024-10-26 18:11:10
492
原创 Snapshot包和Release包区别
版本号通常是固定的,适合生产环境使用。更新频率较低,注重稳定性和可靠性。经常更新,包含最新的功能和修复。代表稳定的、经过全面测试的版本。代表开发中的版本,可能不稳定。通常用于测试和开发阶段。
2024-10-20 08:36:15
246
原创 96. 不同的二叉搜索树【中等】
给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。//一共i个节点,对于根节点j时,左子树的节点个数为j-1,右子树的节点个数为i-j。n个节点 组成 从1到n互不相同的二叉搜索树有dp[n]种。
2024-10-18 07:38:02
296
原创 【玩转动态规划专题】343. 整数拆分【中等】
给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。解释: 2 = 1 + 1, 1 × 1 = 1。dp[n] 正整数n拆分后的最大整数乘积。返回 你可以获得的最大乘积。输入: n = 10。
2024-10-18 07:34:59
218
原创 【玩转动态规划专题】63. 不同路径 II【中等】
一个机器人初始位于 左上角(即 grid[0][0])。机器人尝试移动到 右下角(即 grid[m - 1][n - 1])。机器人的移动路径中不能包含 任何 有障碍物的方格。// m*n的数组 pd[m][n] 在m,n这个点上共有dp[m][n]种不同路径数量。输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]输入:obstacleGrid = [[0,1],[0,0]]obstacleGrid[i][j] 为 0 或 1。解释:3x3 网格的正中间有一个障碍物。
2024-10-15 07:37:58
400
原创 【玩转动态规划专题】62. 不同路径【中等】
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。由于dp[i][0]和dp[0][j] 这一层上都是已知的。dp[m][n] 表示 在m、n网格中共有多少种路径。从左上角开始,总共有 3 条路径可以到达右下角。输入:m = 3, n = 7。输入:m = 3, n = 2。输入:m = 7, n = 3。输入:m = 3, n = 3。问总共有多少条不同的路径?
2024-10-11 07:54:10
464
原创 【玩转动态规划专题】746. 使用最小花费爬楼梯【简单】
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。输入:cost = [1,100,1,1,1,100,1,1,100,1]你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。输入:cost = [10,15,20]请你计算并返回达到楼梯顶部的最低花费。解释:你将从下标为 1 的台阶开始。解释:你将从下标为 0 的台阶开始。dp[i] 表示到第i阶梯的最少花费。
2024-10-10 07:32:33
461
原创 【玩转动态规划专题】70. 爬楼梯【简单】
所以初始化时从1开始,虽然设定dp[0] = 1也可以通过,但dp[0] = 1的意义不正确,与dp[i]数组的含义违背【0阶楼梯有1种方式到达楼顶明显不对】每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意读题dp[0]是不存在的 题目中 1 <= n <= 45。dp[i]以及下标的含义:i阶楼梯有dp[i]种方式到达楼顶。需要 n 阶你才能到达楼顶。解释:有两种方法可以爬到楼顶。解释:有三种方法可以爬到楼顶。
2024-10-09 07:44:12
252
原创 【玩转动态规划专题】509. 斐波那契数【简单】
斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。F(n) = F(n - 1) + F(n - 2),其中 n > 1。解释:F(2) = F(1) + F(0) = 1 + 0 = 1。解释:F(3) = F(2) + F(1) = 1 + 1 = 2。解释:F(4) = F(3) + F(2) = 2 + 1 = 3。本题之所以简单,其实相当于dp[]数组已经已知。给定 n ,请计算 F(n)。
2024-10-08 07:39:22
504
原创 【玩转贪心算法专题】968. 监控二叉树【困难】
解释:需要至少两个摄像头来监视树的所有节点。如果是以下情况,其实就是 左右孩子节点有一个有摄像头了,那么其父节点就应该是2。输入:[0,0,null,0,null,0,null,null,0]左孩子有覆盖,右孩子有覆盖,那么此时中间节点应该就是无覆盖的状态了。此时摄像头的数量要加一,并且return 1,代表中间节点放摄像头。给定一个二叉树,我们在树的节点上安装摄像头。给定树的节点数的范围是 [1, 1000]。情况2:左右节点至少有一个无覆盖的情况。输入:[0,0,null,0,0]
2024-09-29 07:40:41
601
原创 【玩转贪心算法专题】738. 单调递增的数字【中等】
如果从前往后遍历,第一次 33,没问题,第二次32,需要改为 329,但发现329其实并不能满足单调递增。判断两数之间是否单调递增,如果不是则需要变化,将前一个数-1,后面全部置为9,但要主要需从后往前遍历。当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增。输入: n = 1234。输入: n = 332。输入: n = 10。
2024-09-27 07:44:01
428
原创 【玩转贪心算法专题】56. 合并区间【中等】
按照左边界从小到大排序之后,如果 intervals[i][0] <= intervals[i - 1][1] 即intervals[i]的左边界 <= intervals[i - 1]的右边界,则一定有重叠。输入:intervals = [[1,3],[2,6],[8,10],[15,18]]解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].输入:intervals = [[1,4],[4,5]]输出:[[1,6],[8,10],[15,18]]输出:[[1,5]]
2024-09-27 07:19:17
551
原创 【玩转贪心算法专题】763. 划分字母区间【中等】
像 “ababcbacadefegde”, “hijhklij” 这样的划分是错误的,因为划分的片段数较少。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。划分结果为 “ababcbaca”、“defegde”、“hijhklij”。注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s。输入:s = “ababcbacadefegdehijhklij”返回一个表示每个字符串片段的长度的列表。输入:s = “eccbbbbdec”输出:[9,7,8]
2024-09-23 07:41:24
514
原创 【玩转贪心算法专题】452. 用最少数量的箭引爆气球是【中等】
墙面上的气球记录在整数数组 points ,其中points[i] = [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。输入:points = [[10,16],[2,8],[1,6],[7,12]]输入:points = [[1,2],[3,4],[5,6],[7,8]]输入:points = [[1,2],[2,3],[3,4],[4,5]]-在x = 11处发射箭,击破气球[10,16]和[7,12]。-在x = 6处射出箭,击破气球[2,8]和[1,6]。
2024-09-14 07:56:02
946
原创 @Deprecated 注解的作用及使用示例
注解是 Java 中一个重要的工具,用于管理和维护过时的代码。通过标记不再推荐使用的代码,可以帮助开发者迁移到更好的替代方案,确保代码库的健康和可维护性。
2024-09-11 07:43:41
777
原创 【玩转贪心算法专题】406. 根据身高重建队列【中等】
因此 [[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] 是重新构造后的队列。输入:people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]输入:people = [[6,0],[5,0],[4,0],[3,2],[2,2],[1,4]]输出:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]输出:[[4,0],[5,0],[2,2],[3,2],[1,4],[6,0]]那么只需要按照k为下标重新插入队列就可以了。
2024-09-11 07:40:46
694
原创 【玩转贪心算法专题】860. 柠檬水找零【简单】
每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。对于最后一位顾客,我们无法退回 15 美元,因为我们现在只有两张 10 美元的钞票。对于接下来的 2 位顾客,我们收取一张 10 美元的钞票,然后返还 5 美元。第 5 位顾客那里,我们找还一张 10 美元的钞票和一张 5 美元的钞票。第 4 位顾客那里,我们收取一张 10 美元的钞票,并返还 5 美元。情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个5。前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。
2024-09-10 07:21:08
630
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人