- 博客(593)
- 资源 (2)
- 问答 (1)
- 收藏
- 关注
原创 LeetCode 322. 零钱兑换 算法详解.pdf
摘要:本文通过百度网盘分享LeetCode 322题"零钱兑换"的算法详解PDF,包含动态规划解法思路。文件提取码8888,可供算法学习者参考。由于CSDN平台渲染问题,暂时以网盘形式分享该资源。该题考察用最少数量的硬币组成指定金额,是经典的动态规划问题。
2025-09-03 20:38:43
41
原创 LeetCode 239. 滑动窗口最大值 - 最优算法实现
摘要:LeetCode 239题要求找出滑动窗口中的最大值。最优解法使用双端队列维护单调递减队列,时间复杂度O(n)。关键步骤:1)移除超出窗口的索引;2)移除比当前元素小的索引;3)添加当前索引;4)窗口形成时记录队头索引对应的最大值。示例演示了处理数组[1,3,-1,-3,5,3,6,7]时队列的动态变化过程,最终结果为[3,3,5,5,6,7]。该算法通过保持队列单调性,确保每个元素只进出队列一次,实现高效求解。
2025-09-03 11:27:40
736
原创 LeetCode 31. 下一个排列
本文介绍了LeetCode 31题"下一个排列"的高效解法。该算法通过4个关键步骤实现:1)从右向左寻找第一个小于右邻居的突破点;2)若未找到则反转整个数组;3)找到突破点后,从右向左寻找第一个大于它的数进行交换;4)反转突破点右侧部分。文中提供了最简20行代码实现和详细注释版,并通过多个示例(如[1,2,3]→[1,3,2])逐步演示算法执行过程,解释其核心思想是找到"刚好比当前排列大一点点"的排列。最后还分析了算法原理,说明为何这种策略能确保得到正确结果。
2025-09-02 19:32:16
687
原创 LeetCode22生成括号算法
本文详细解析了生成有效括号组合的函数式递归算法。该方法采用分治策略,通过递归分解问题:每次调用根据当前状态(已构建字符串、左右括号数)生成子问题,合并子问题的解返回最终结果。以n=2为例,展示了完整的递归树和执行过程,包括添加左/右括号的条件判断(left<n且right<left)和终止条件(字符串长度达到2n)。算法通过不断分解与合并子问题解,避免了全局状态修改,体现了典型的函数式编程思维。最终返回所有可能的有效括号组合,如n=2时返回["(())", "()(
2025-09-02 11:17:20
723
原创 LeetCode 165. 比较版本号 - 优雅Java解决方案
本文介绍了LeetCode 165题比较版本号的Java解决方案。题目要求比较两个由点号分隔的版本号字符串,忽略前导零,缺失修订号视为0。文章提供了两种实现方案:双指针法和优化的单次遍历法,后者空间复杂度更优。通过示例详细说明了算法执行过程,并分析了时间复杂度和空间复杂度。关键点包括处理前导零、不同长度版本号比较和边界条件处理。测试用例验证了解决方案的正确性,适用于各种边界情况。该方案具有良好的可读性和效率。
2025-09-02 00:10:23
371
原创 LeetCode199. 二叉树的右视图 - 解题思路与实现
摘要 本文介绍了二叉树的右视图问题的三种解法。右视图即每层最右侧节点的集合。主要解法包括:1)BFS层序遍历,记录每层最后一个节点;2)DFS右优先遍历(推荐),利用递归优先访问右子树,当首次访问某层时加入结果;3)DFS左优先遍历,使用HashMap记录并更新每层节点。BFS时间空间复杂度均为O(n),DFS右优先时间O(n)、空间O(h)。DFS右优先最为优雅,通过先右后左的遍历顺序确保首次访问即为最右节点。
2025-09-01 23:20:48
680
原创 LeetCode 19: 删除链表的倒数第 N 个结点
本文介绍了LeetCode第19题删除链表倒数第N个节点的两种解法。重点分析了双指针一趟扫描算法,通过快指针先走n+1步,使慢指针停在待删除节点的前驱位置,实现高效删除。该算法时间复杂度O(L),空间复杂度O(1),能优雅处理边界情况。文章通过可视化示例、代码实现和复杂度分析,详细阐述了双指针技巧在链表问题中的应用优势,并提供了测试用例验证和扩展思考。
2025-09-01 23:03:17
846
原创 LeetCode 142. 环形链表 II - 最优雅解法详解
本文详解了LeetCode 142题环形链表II的最优解法——Floyd循环检测算法。该算法通过快慢指针分两阶段处理:首先检测环的存在(快指针每次2步,慢指针每次1步),当两指针相遇时,数学推导证明链表头到环入口的距离等于相遇点到环入口的距离。于是将慢指针重置到头部,两指针以相同速度前进,最终会在环入口相遇。该方案时间复杂度O(n),空间复杂度O(1),满足进阶要求,体现了算法设计中数学与工程的完美结合。
2025-09-01 22:08:29
653
原创 LeetCode82删除排序链表中的重复元素 II
本文介绍了一种删除排序链表中所有重复元素的算法。题目要求删除所有重复数字的节点,只保留不重复的数字。算法采用虚拟头节点简化边界处理,使用双指针技巧(prev和curr)遍历链表。当发现重复节点时,记录重复值并跳过所有相同值的节点,最后将prev指向第一个不重复的节点。时间复杂度为O(n),空间复杂度O(1)。文章通过示例演示算法步骤,分析边界情况,并指出常见错误,强调虚拟头节点和完全跳过重复节点的重要性。
2025-09-01 21:32:46
801
原创 LeetCode54螺旋矩阵算法详解
本文详细讲解了螺旋矩阵算法,通过维护四个边界(top,bottom,left,right)来控制遍历范围。算法按顺时针方向循环执行四个步骤:1)从左到右遍历上边界;2)从上到下遍历右边界;3)从右到左遍历下边界;4)从下到上遍历左边界。每完成一个方向就收缩对应边界,并需特别注意单行/单列情况下的边界检查。该算法时间复杂度为O(m×n),空间复杂度O(1),是一种经典的边界控制模拟算法。
2025-08-30 22:25:13
934
原创 最长递增子序列
本文详细介绍了求解最长递增子序列(LIS)的二分查找解法。该算法通过维护一个tails数组,其中tails[i]表示长度为i+1的递增子序列的最小末尾元素。对于每个新元素,通过二分查找确定其在tails中的位置:若大于所有元素则扩展序列,否则替换相应位置保持最小末尾。算法时间复杂度为O(n log n),空间复杂度O(n)。文章通过具体示例演示了算法过程,解释了关键概念和常见疑问,突出其相比动态规划的性能优势。该解法巧妙结合贪心思想和二分查找,高效解决了LIS问题。
2025-08-30 22:17:19
423
原创 LeetCode 92. 反转链表 II - 算法解析
本文介绍了LeetCode 92题"反转链表II"的解法,详细解析了算法思路和代码实现。通过创建虚拟头节点简化处理,使用三指针法原地反转指定区间的链表节点,最后重新连接链表前后部分。算法时间复杂度O(n),空间复杂度O(1),并附有图解示例说明反转过程。关键点包括虚拟头节点使用、找准关键连接点、标准反转操作和正确重连链表。该解法高效简洁,能完善处理各种边界情况。
2025-08-30 15:53:55
263
原创 ZipList优缺点总结
摘要: ZipList是一种极致节省内存的数据结构,通过无指针开销、变长编码和连续存储实现高效内存利用率,尤其适合存储少量小元素。其优点包括高内存效率和顺序访问性能,但对写操作敏感,存在连锁更新风险(O(N²)复杂度)和随机访问效率低(O(N))的缺点。Redis在元素较少时使用ZipList,超出阈值则转换为其他结构。后续引入的Listpack通过改进编码方式解决了连锁更新问题,成为其替代方案。ZipList的核心设计体现了以时间换空间的权衡。
2025-08-17 14:44:08
603
原创 (ZipList入门笔记三)——Entry 节点
Redis的ZipList(压缩列表)采用连续内存存储,通过Entry节点实现高效内存利用。Entry由三部分组成:1)previous_entry_length变长字段记录前节点长度,支持反向遍历;2)encoding变长字段编码数据类型和长度,支持字符串和整数存储;3)content存储实际数据。ZipList特点包括无指针设计、变长编码和连续内存布局,但存在连锁更新风险,可能导致性能下降。因此ZipList适合存储少量小元素,大容量场景会转为更高效的数据结构。
2025-08-17 14:38:30
901
原创 (ZipList入门笔记二)为何ZipList可以实现内存压缩,可以详细介绍一下吗
想象一下,如果你要存储的数据只是一个很小的整数(例如数字 5,实际只需要 1 字节),那么为了存储这 1 字节的数据,你就要付出 16 字节的指针开销。正因为如此,Ziplist 只适用于存储元素数量较少、内容较小的场景(List, Hash, Zset),并且在后来的 Redis 版本中,逐渐被性能更稳定的。,它实际上只需要 1 个字节,但系统依然会为其分配 4 字节,剩下的 3 字节就被浪费了。的长度,当在列表的某个位置插入一个新节点,或者删除了一个节点,可能会导致其。这种极致的压缩是有代价的。
2025-08-05 22:45:42
851
原创 (ZipList入门笔记一)ZipList的节点介绍
Redis 的 Ziplist(压缩列表)是一种紧凑的内存数据结构,用于存储少量元素的 List、Hash 和 Zset。其结构包含:32位的 zlbytes(总字节数)、zltail(尾节点偏移量),16位的 zllen(节点数),可变长度的 entry(节点数据),以及1字节的 zlend(结束标记 0xFF)。每个 entry 由 previous_entry_length、encoding 和 content 组成,通过变长编码和前驱节点长度实现双向遍历,极大节省内存。Ziplist 以连续内存布局
2025-08-05 22:17:34
453
原创 win11获取最高权限(比管理员权限还要高)
获取 Windows 11 的 SYSTEM 权限是一个高风险操作,仅限合法技术研究使用。SYSTEM 账户拥有最高系统权限,误操作可能导致系统崩溃或安全漏洞。常见方法是使用微软官方工具 PsExec:下载 Sysinternals Suite,以管理员身份运行命令提示符,执行 psexec -s -i cmd.exe 命令即可获得 SYSTEM 权限的交互窗口(可通过 whoami 验证)。务必谨慎操作,严禁用于非法用途。
2025-08-01 15:15:01
761
原创 Java的依赖注入的理解
本文深入浅出地讲解了Java中的依赖注入(DI)概念。首先介绍了控制反转(IoC)的核心思想,指出传统方式下对象自己创建依赖会导致高耦合和测试困难的问题。然后详细阐述了依赖注入的三种主要实现方式:构造函数注入(推荐使用)、Setter方法注入和字段注入(通过注解实现),并分析了各自的优缺点。最后用一个餐厅点菜的生动比喻来说明DI的优势。文章强调在现代Java开发中,尤其是使用Spring框架时,依赖注入是必须掌握的关键概念,它能有效解耦代码,提高可测试性和灵活性。
2025-07-31 16:57:16
859
原创 AOF和RDB分别适用于什么场景 高读写场景用RDB还是AOF好
Redis持久化方式对比:RDB通过定时快照提供高效备份,适合容忍数据丢失的场景;AOF记录所有写命令,确保数据完整性但恢复较慢。对于高读写场景,推荐混合持久化(4.0+),结合RDB快速恢复和AOF数据安全的优势,实现性能与可靠性的最佳平衡。
2025-07-30 11:03:46
1058
原创 Http401和403什么意思
HTTP 401和403状态码都表示访问被拒绝,但有本质区别。401(未授权)意味着身份认证失败,服务器无法确认用户身份,需要重新提供有效凭证。403(禁止访问)则表示身份已确认但权限不足,即使重新认证也无法访问。简单来说,401是"无法验证你是谁",403是"知道你是谁但不允许访问"。两者的核心差异在于前者是认证问题,后者是授权问题。
2025-07-30 10:59:03
817
原创 某老牌大厂面试官:MySQL的Join和On哪个先执行?
SQL查询中,JOIN和ON是一个整体操作,先于WHERE条件执行。JOIN确定表的连接方式,ON定义连接条件,两者共同生成一个虚拟中间表。WHERE子句随后对该中间表进行过滤。在LEFT JOIN中,ON条件决定右表匹配方式(不匹配时保留左表行),WHERE则对所有结果行进行过滤,可能导致LEFT JOIN效果失效。理解这个执行顺序(FROM/JOIN→WHERE→GROUP BY等)对正确编写SQL查询至关重要,特别是在处理表连接和过滤条件时。
2025-07-30 10:58:00
905
原创 某老牌大厂面试官:MySQL的Join和On哪个先执行?
SQL查询中,JOIN和ON是一个整体操作,先于WHERE条件执行。JOIN确定表的连接方式,ON定义连接条件,两者共同生成一个虚拟中间表。WHERE子句随后对该中间表进行过滤。在LEFT JOIN中,ON条件决定右表匹配方式(不匹配时保留左表行),WHERE则对所有结果行进行过滤,可能导致LEFT JOIN效果失效。理解这个执行顺序(FROM/JOIN→WHERE→GROUP BY等)对正确编写SQL查询至关重要,特别是在处理表连接和过滤条件时。
2025-07-30 10:56:03
745
原创 server error - Ports are not available: exposing port bind: An attempt was made to access a socket
摘要:在配置Cassandra服务时发现7000和7001端口无法使用,但排查显示端口未被占用。通过执行netsh int ipv4 show excludedportrange protocol=tcp命令发现6986-7085端口范围被系统保留。解决方案是选择不在该保留范围内的其他端口进行配置。
2025-07-22 22:30:04
187
原创 SSE和WebSocket区别到底是什么
摘要:SSE(服务器发送事件)和WebSocket是现代Web实时通信的两大主流技术,核心差异在于通信方向:SSE仅支持服务器到客户端的单向推送,基于HTTP协议实现简单;WebSocket则支持双向全双工通信,能处理文本和二进制数据但实现复杂。SSE适合新闻推送、股票行情等单向场景,内置自动重连机制;WebSocket则适用于聊天室、在线协作等双向交互场景,需手动实现错误处理。技术选型应首先判断是否需要双向通信,SSE更轻量简单,WebSocket功能更强大全面。
2025-07-20 21:16:30
603
原创 长轮询和WebSocket的区别到底在哪里?为什么说长轮询会维护大量连接,但又说WebSocket连接持续,无需反复建立/关闭,减少资源消耗??这不矛盾吗?到底改进了哪里??
长轮询和WebSocket的关键区别在于连接性质不同。长轮询通过频繁建立短暂连接模拟持久连接,每次请求都需完整HTTP握手过程,消耗大量资源。而WebSocket建立真正的持久化全双工连接,仅需一次HTTP升级握手,后续通信使用轻量级数据帧。WebSocket从根本上解决了长轮询重复握手和头部臃肿的问题,显著降低了服务器负载,实现了真正高效的实时通信。二者的"连接"概念本质不同,因此并不矛盾。
2025-07-20 20:18:27
523
原创 Public Key Retrieval is not allowed
摘要:本文介绍了在Spring Boot的yml配置文件中添加MySQL连接参数allowPublicKeyRetrieval=true的方法,该参数用于解决JDBC连接时的公钥检索问题。配置方式是在数据库URL后追加参数,并附有截图说明。这个设置适用于需要绕过SSL公钥验证的特殊场景,但需注意安全性考量。
2025-07-19 19:56:53
232
原创 div和span区别
本文通过Vue组件演示了HTML中DIV和SPAN标签的核心区别:1)DIV是块级元素,独占一行;SPAN是行内元素,可同排显示;2)DIV可设置宽高,SPAN尺寸由内容决定;3)DIV适合布局容器,SPAN适合文本样式控制。示例包含基础对比、尺寸设置差异、实际应用场景(DIV用于页面结构,SPAN用于文本修饰)及混合使用案例,通过可视化样式直观展示了二者的不同特性和适用场景。
2025-07-18 17:15:26
935
原创 This model provider doesn‘t serve your region. Visit https://docs.cursor.com/account/regions for mor
cursor禁用了中国区IP解决方案
2025-07-17 18:01:17
1033
原创 既然扩容,那新分配的空间必然是两个不一样的数组空间,理论上应该都是要拷贝回去新数组,这与jdk7的rehash应该只是方式不一样,但是效率一样的吧,优化了个寂寞?
摘要: JDK 8在HashMap扩容(rehash)时优化显著优于JDK 7。JDK 7采用头插法,需为每个元素重新计算索引,易导致链表倒序和并发死循环;而JDK 8通过智能拆分(利用hash & oldCapacity判断)和尾插法,无需逐个重算索引,直接拆分链表到新位置,保持元素顺序,效率更高且避免并发问题。核心差异在于JDK 8的算法设计更高效(减少计算量)和更安全(杜绝环形链表),整体性能优于JDK 7。
2025-07-14 23:48:54
856
原创 TCP和UDP区别
TCP与UDP是网络传输层的两大核心协议,主要区别体现在: 连接方式:TCP需三次握手建立连接,UDP无连接; 可靠性:TCP提供确认重传机制保证可靠传输,UDP不保证数据必达; 有序性:TCP确保数据有序,UDP不保证顺序; 性能:TCP因复杂控制机制速度较慢,UDP轻量高效; 头部开销:TCP头部至少20字节,UDP仅8字节。 典型应用场景: TCP适用于网页、文件传输等可靠性优先的场景 UDP适用于直播、视频通话等实时性优先的场景
2025-07-13 23:34:03
1989
3
原创 京东面试官:WebSocket 和 HTTP 有什么区别?
WebSocket与HTTP协议对比摘要(149字): HTTP协议采用单向请求-响应模式,每个请求需附带完整头部信息,通信开销较大,适用于传统网页浏览等场景。WebSocket通过HTTP完成握手后升级为全双工通信,建立持久化连接,仅需2-10字节帧头,实现服务器主动推送,适合实时聊天、在线游戏等高频交互场景。两者关键差异在于:HTTP无状态、短连接、高开销;WebSocket有状态、长连接、低延迟,分别对应"寄信式"和"通话式"通信模型。WebSocket弥补了H
2025-07-13 23:19:04
568
原创 讲一下LongAdder
摘要:文章通过超市收银台的比喻,对比了Java中的AtomicLong和LongAdder两种并发计数实现。AtomicLong在高并发时因CAS重试导致性能下降,而LongAdder采用"分散热点"策略,通过主账本(base)和分账本(Cell[])实现高效写入。LongAdder适用于读少写多的场景(如访问量统计),以空间换时间提升性能;AtomicLong则更适合低并发或需精确原子更新的场景。主要差异体现在高并发写入性能、读取耗时和内存占用等方面。
2025-07-12 11:09:49
385
原创 千辛万苦3面却倒在性格测试?这太离谱了吧!
一位求职者在多轮测开面试表现优异,却因性格测试被拒。痛定思痛后,他总结出四大答题策略:强烈建议选择体现"积极主动"和"团队协作"的选项;中性题目可随意作答;坚决避开"消极被动"类答案。企业最青睐的性格特质包括责任心、抗压能力和目标导向。文章以红字突出关键建议,辅以图片说明,为求职者提供了一套实用的性格测试通关指南。
2025-07-11 23:13:55
208
原创 (生活比喻-图文并茂)http2.0和http3.0的队头阻塞,http2.0应用层解决,TCP层存在,3.0就是彻底解决,到底怎么理解区别???
本文通过收费站与高速公路的比喻,生动解析了HTTP协议不同版本的队头阻塞问题。HTTP/1.1因单车道模式导致严重阻塞;HTTP/2通过多路复用解决了应用层阻塞,但TCP层的丢包仍会阻塞整个连接;HTTP/3采用QUIC协议实现多车道独立传输,彻底解决了队头阻塞问题。文章用直观的类比清晰展示了各版本协议的核心差异与改进原理,帮助读者深入理解网络协议的发展演进。
2025-07-08 16:39:53
1313
原创 HTTP/3.0的连接迁移使用连接ID来标识连接为什么可以做到连接不会中断
HTTP/3通过QUIC协议的"连接ID"实现了网络切换时的无缝连接迁移,与HTTP/2的TCP连接形成鲜明对比。传统HTTP/2基于四元组(IP+端口)标识连接,网络切换时连接会中断;而HTTP/3通过固定不变的连接ID识别会话,即使IP地址变化也能保持连接不中断。这就像从固定电话(认号码)升级到微信通话(认房间号),移动设备切换Wi-Fi和蜂窝网络时,视频、下载等传输不会中断。图文对比显示:HTTP/2需要重新建立连接,HTTP/3则可自动恢复,显著提升了移动网络体验。
2025-07-08 16:07:12
642
原创 golang的defer
本文用通俗易懂的方式解释了Go语言中的defer机制。将defer比作"临时便签",即在函数执行时记录需要延迟执行的操作,待函数结束前按后进先出的顺序执行。通过回家关灯锁门、文件操作等生活化示例,对比展示了使用defer可以简化资源清理代码,确保无论函数如何退出都能执行必要操作。关键点包括:defer的执行时机是在包含它的函数返回前,执行顺序是后进先出,且适用于各种退出情况(正常返回、panic等)。这种"便签"类比帮助开发者直观理解defer的作用机制。
2025-07-06 12:27:52
369
原创 字节二面:进程,线程,协程区别
进程、线程和协程是三种并发编程模型,主要区别在于资源占用、切换开销和调度方式。进程拥有独立的内存空间,资源消耗大但稳定性高;线程共享进程资源,切换开销较小;协程由用户态控制,切换开销最小且适合高并发场景。进程适用于资源隔离,线程适合共享数据,协程则针对I/O密集型任务。三者在调度方式、通信机制和应用场景上各有特点,选择合适模型可优化程序性能。
2025-07-06 11:54:43
1582
原创 JWT鉴权的流程和原理
JWT鉴权流程与原理详解 JWT(JSON Web Token)是一种无状态认证机制,由Header、Payload和Signature三部分组成,通过Base64Url编码后用点连接。其核心原理是服务器用密钥对前两部分签名生成令牌,客户端存储后每次请求携带,服务器只需验证签名和时效而无需查询数据库。 鉴权流程包含:用户登录→服务器验证并签发Token→客户端存储→后续请求携带→服务器验证。JWT自带用户信息,适合跨域和微服务场景,但存在无法主动失效、体积较大等缺点。关键优势是无状态扩展性强,但需妥善保管签
2025-07-01 01:43:04
912
PHP写链表 页面刷新问题
2021-06-17
TA创建的收藏夹 TA关注的收藏夹
TA关注的人