- 博客(67)
- 收藏
- 关注
原创 暑假算法日记第五天
本文分享了6道LeetCode滑动窗口与双指针相关算法题的解题思路和代码实现。主要内容包括:683题(K个关闭的灯泡)通过定长滑动窗口寻找最小天数;2067题(等计数子串)利用滑动窗口统计满足条件的子串;2524题(子数组的最大频率分数)使用滑动窗口维护幂次和。文章还提及了2269、1984、1461等题目,提供leetcode.cn的题单链接,记录每日算法练习进度。所有代码均采用Python实现,时间复杂度多为O(n)级别,适合算法刷题者参考。
2025-07-10 00:00:09
939
原创 暑假读书笔记第五天
摘要:文章对比了Linux与Windows内核设计差异,Linux采用宏内核架构,所有模块运行在内核态;Windows采用混合内核设计,兼具微内核与宏内核特点。同时深入探讨了虚拟内存机制,指出其通过地址映射实现进程隔离、分页分段解决内存碎片问题,并借助内存交换技术提升效率。现代操作系统通过虚拟内存管理实现了内存保护、共享与扩充,成为多任务处理的基础支撑。
2025-07-09 23:20:14
1049
原创 暑假算法日记第四天
本文总结了LeetCode两道滑动窗口与双指针相关题目:2953(统计完全子字符串)和1016(子串能表示1到N数字的二进制串)。第一题通过分组循环和滑动窗口统计满足条件的子字符串,时间复杂度O(264n)。第二题利用二进制特性,通过滑动窗口检查所有可能的子串覆盖情况,时间复杂度O(m)。学习重点包括滑动窗口优化、二进制位操作以及分组循环技巧。
2025-07-08 22:50:40
1165
原创 暑假读书笔记第四天
软中断是Linux系统处理中断的下半部机制,用于处理耗时较长的任务。系统将中断分为两部分:上半部(硬中断)快速处理硬件请求,下半部(软中断)延迟处理复杂任务。软中断以内核线程方式运行,每种CPU对应一个ksoftirqd线程。通过/proc/softirqs可查看软中断类型和运行情况,如网络接收中断NET_RX等。若软中断CPU使用率过高,可通过top和watch -d cat /proc/softirqs定位问题,如网络中断频繁时可使用sar和tcpdump进一步分析流量来源。
2025-07-08 22:12:40
879
原创 暑假算法日记第三天
本文总结了9道LeetCode滑动窗口与双指针相关题目的解题思路和代码实现。主要内容包括:重新安排会议时间最大化空余时间、环形数组最少交换次数组合1、子串最大出现次数、滑动子数组美丽值等问题的解法。通过滑动窗口技巧和哈希表等数据结构,实现了O(n)时间复杂度的解决方案。特别针对不同题目特点,如环形数组处理、定长窗口优化、第x小元素查找等场景,提供了相应的优化思路和代码模板。这些题目涵盖了滑动窗口算法在实际应用中的多种典型场景。
2025-07-07 23:21:46
1749
1
原创 暑假读书笔记第三天
本文摘要: CPU缓存一致性:介绍两种数据写入方法——写直达(写入Cache和内存)和写回(仅写入Cache,替换时写回内存)。多核场景下需要写传播和事务串行化,通过总线嗅探和MESI协议(Modified/Exclusive/Shared/Invalidated状态)实现缓存一致性。 伪共享问题:当多个线程频繁修改同一Cache Line的不同变量时,导致缓存频繁失效。解决方案包括内存对齐(如Linux内核的宏)和填充技术(如Java Disruptor的字节填充)。 CPU任务调度:Linux中线程和进
2025-07-07 21:51:54
694
原创 暑假算法日记第二天
本文总结了LeetCode定长滑动窗口类题目的解题思路与代码实现。包含2461、1423、1052、1652、1176等题目,涉及子数组最大和、卡牌点数、顾客满意度、循环数组求和、健身计划评估等场景。解题关键在于运用滑动窗口技巧,在时间复杂度O(n)下解决问题。文章提供了每题的解题思路、复杂度分析和Python代码实现,对算法学习者具有参考价值。
2025-07-06 22:49:45
1021
原创 暑假读书笔记第二天
【摘要】本文学习笔记探讨了存储器层次结构及CPU缓存优化策略。存储器分为外存、内存、CPU高速缓存和寄存器四级,速度越快成本越高容量越小。CPU访问数据遵循从寄存器到L1/L2/L3缓存再到内存的层级顺序,利用缓存机制提升效率。重点分析了SRAM与DRAM的区别,指出机械硬盘比内存慢十万倍,L1缓存比内存快百倍。在代码优化方面,提出三种方法:1)顺序访问数据提升缓存命中率;2)通过排序等操作优化分支预测;3)减少线程在CPU核心间切换以避免缓存失效。这些策略能显著提升程序运行效率。
2025-07-06 22:11:02
680
原创 暑假读书笔记第一天
文章摘要:本文解析了CPU执行程序的基本原理。首先介绍了冯诺依曼计算机模型的基本结构,包括运算器、控制器、存储器等核心组件。然后详细阐述了内存存储方式(线性地址空间)和CPU处理能力(32/64位差异)。重点说明了指令周期(Fetch-Decode-Execution-Store)和指令类型(数据传输、运算、跳转等),并通过MIPS指令集示例具体说明。最后讨论了影响CPU执行速度的三个关键因素:指令数、CPI(每条指令周期数)和时钟周期时间,并指出可通过编译器优化、流水线技术和超频等方式提升程序运行速度。
2025-07-05 22:04:48
637
原创 暑假算法日记第一天
本文总结了6道滑动窗口与双指针相关的LeetCode题目解题思路,包括1456、643、1343、2090、2379和2841题。这些题目均采用滑动窗口技术,核心思想是"入-更新-出"的基本框架。解题要点包括:窗口初始化、窗口移动时的元素增减、边界条件处理等。时间复杂度均为O(n),空间复杂度多为O(1)。典型应用场景包括求定长子串元音最大数、子数组最大平均数、满足条件的子数组计数等。通过这组题目可以系统掌握滑动窗口算法的实现技巧和变通方法。
2025-07-05 21:45:21
1283
2
原创 代码随想录算法训练营第五十三天
本文总结了两个算法题目:1)使用Floyd算法解决公园景点间最短路径问题,通过动态规划预处理所有节点间的最短距离,时间复杂度O(n^3);2)采用A启发式搜索算法计算象棋骑士从起点到终点的最短步数,结合优先级队列和估值函数优化搜索效率。两种算法分别适用于不同场景的最短路径求解,Floyd适合全源最短路,A则针对单源最优路径。文章附带Java代码实现和复杂度分析,并整理了往期算法训练营的学习链接。
2025-05-29 21:53:50
1391
原创 代码随想录算法训练营第四十九天
本文介绍了解决岛屿连通问题的两种最小生成树算法:Prim和Kruskal。Prim算法通过贪心策略逐步扩展生成树,包括朴素实现和优先队列优化版本,时间复杂度为O(n²)或O(nlogn)。Kruskal算法则按边权排序并使用并查集检测环,时间复杂度为O(mlogm)。两种算法都能确保以最小总距离连接所有岛屿,适用于无向图的公路规划场景。
2025-05-24 16:56:43
1292
原创 代码随想录算法训练营第四十八天
本文主要介绍了LeetCode中关于冗余边的两个问题:108. 冗余的边和109. 冗余的边II。108题要求在一个无向图中找到并删除一条冗余边,使得图恢复为树。通过并查集(Union-Find)算法,可以在O(n)的时间复杂度内解决。109题则是在有向图中找到并删除一条冗余边,使得图恢复为有向树。由于有向图的特殊性,需要额外处理入度为2的节点,并确保删除边后图仍为树。两题均通过并查集实现,时间复杂度为O(n),空间复杂度为O(n)。文章还提供了详细的代码实现和思路分析,帮助读者理解并查集在图论中的应用。
2025-05-23 21:07:35
1177
原创 代码随想录算法训练营第四十六&四十七天
卡码网题目涵盖了多个算法问题,包括字符串接龙、有向图的完全联通、岛屿的周长和寻找存在的路径。其中,110. 字符串接龙要求从起始字符串通过每次改变一个字符,最终转换为目标字符串,且中间字符串必须在给定字典中。解题思路包括构建图并通过广度优先搜索(BFS)寻找最短路径,时间复杂度为O(n),空间复杂度为O(n)或O(n^2)。105. 有向图的完全联通则涉及判断有向图是否完全联通,通常通过深度优先搜索(DFS)或BFS遍历图来实现。其他题目如岛屿的周长和寻找存在的路径也涉及图论和搜索算法的应用。这些题目旨在帮
2025-05-22 21:14:16
872
原创 代码随想录算法训练营第四十五天
本文介绍了两个与孤岛相关的算法问题:孤岛的总面积和沉没孤岛。两个问题都基于一个由1(陆地)和0(水)组成的矩阵,孤岛指的是被水域完全包围且不接触矩阵边缘的陆地区域。 孤岛的总面积:通过深度优先搜索(DFS)或广度优先搜索(BFS)遍历矩阵,计算所有孤岛的总面积。首先标记边缘岛屿,剩余的即为孤岛,最后累加其面积。时间复杂度为O(nm),空间复杂度为O(nm)。 沉没孤岛:同样使用DFS或BFS遍历矩阵,标记边缘岛屿,然后将未标记的孤岛区域(1)转变为水域(0)。时间复杂度为O(nm),空间复杂度为O(nm)。
2025-05-20 20:12:35
1544
原创 代码随想录算法训练营第四十四天
卡码网的两道题目分别涉及岛屿数量和岛屿最大面积的计算。99. 岛屿数量要求计算由1(陆地)和0(水)组成的矩阵中岛屿的数量,岛屿由相邻的陆地连接而成。通过深度优先搜索(DFS)或广度优先搜索(BFS)遍历地图,及时标记已访问的陆地,避免重复计算,时间复杂度和空间复杂度均为O(nm)。100. 岛屿的最大面积则要求计算岛屿的最大面积,面积由组成岛屿的陆地总数决定。同样使用DFS或BFS遍历地图,记录每个岛屿的面积并比较最大值,时间复杂度和空间复杂度也为O(nm)。两道题均通过Flood Fill算法实现连通区
2025-05-19 21:04:37
1216
原创 代码随想录算法训练营第四十二&四十三天
本文总结了LeetCode和卡码网的三道题目:42. 接雨水、84. 柱状图中最大的矩形和98. 所有可达路径。接雨水问题通过单调栈解决,时间复杂度为O(n),空间复杂度为O(n)。柱状图中最大的矩形同样使用单调栈,时间复杂度为O(n),空间复杂度为O(n)。所有可达路径问题通过DFS深搜解决,时间复杂度为O(m),空间复杂度为O(m)。通过这些题目,练习了单调栈和DFS的应用。
2025-05-17 15:42:48
943
原创 代码随想录算法训练营第四十一天
本文总结了LeetCode中关于单调栈的三道题目:739. 每日温度、496. 下一个更大元素 I 和 503. 下一个更大元素 II。每道题目都通过单调栈的思想解决了寻找数组中下一个更大元素的问题。739题通过单调栈记录温度递增的索引差,496题通过映射和单调栈找到nums1中元素在nums2中的下一个更大元素,503题则通过遍历两遍数组处理循环数组的情况。所有题目的时间复杂度均为O(n),空间复杂度也为O(n)。通过这些练习,进一步巩固了单调栈的应用。
2025-05-15 20:21:20
1321
原创 代码随想录算法训练营第四十天
本文主要介绍了LeetCode中两道关于回文子串和回文子序列的题目:647. 回文子串和516. 最长回文子序列。对于647题,通过动态规划的方法,统计字符串中所有回文子串的数量,时间复杂度为O(n^2),空间复杂度为O(n^2)。对于516题,同样使用动态规划,找出字符串中最长的回文子序列长度,时间复杂度为O(n^2),空间复杂度为O(n^2)。文章还总结了动态规划在解决各类问题中的应用,包括斐波那契数列、背包问题、股票交易等,并提供了往期打卡的链接。
2025-05-14 11:53:29
966
原创 代码随想录算法训练营第三十九天
本文总结了LeetCode中关于字符串编辑距离的三道题目:115. 不同的子序列、583. 两个字符串的删除操作和72. 编辑距离。这些题目都涉及通过增删改操作使字符串匹配或达到目标状态,核心思路是使用动态规划,通过二维数组记录状态转移。115题统计字符串s的子序列中t出现的次数;583题计算使两个字符串相同所需的最小删除步数;72题求将一个字符串转换为另一个字符串所需的最少操作数(插入、删除、替换)。三题的时间复杂度和空间复杂度均为O(nm),其中n和m为字符串长度。解决这类问题的关键在于理解状态转移方程
2025-05-13 20:11:50
1438
原创 代码随想录算法训练营第三十八天
本文总结了LeetCode中的几道经典动态规划与回溯算法题目,包括最长公共子序列、不相交的线、最大子数组和、判断子序列以及找出3位偶数。每道题目都提供了问题描述、解题思路、复杂度分析以及代码实现。最长公共子序列和不相交的线问题通过动态规划解决,最大子数组和问题采用贪心或动态规划,判断子序列问题则通过顺序匹配或动态规划实现。最后,找出3位偶数问题通过回溯算法解决。这些题目涵盖了动态规划和回溯算法的核心思想,适合算法学习者深入理解与应用。
2025-05-12 15:33:25
1391
原创 代码随想录算法训练营第三十七天
本文总结了LeetCode中几道关于子序列和数组的题目,包括最长递增子序列、最长连续递增序列、最长重复子数组和数组的最小相等和。每道题都提供了问题描述、解题思路、时间复杂度和空间复杂度分析,并附上了Java代码实现。通过这些题目,练习了动态规划、二分查找等算法技巧,帮助理解如何高效解决子序列和数组相关的问题。
2025-05-10 17:52:04
1478
原创 代码随想录算法训练营第三十五&三十六天
本文总结了LeetCode上多道关于买卖股票最佳时机的题目,涵盖了不同交易限制条件下的解决方案。每道题目都通过动态规划的思路,分别考虑了交易次数、冷冻期、手续费等因素,逐步优化了状态转移方程。具体题目包括: 121. 买卖股票的最佳时机:只能进行一次交易,通过维护持有和未持有状态,找到最大利润。 122. 买卖股票的最佳时机 II:可以进行多次交易,通过状态转移计算最大利润。 123. 买卖股票的最佳时机 III:最多进行两次交易,通过维护多个状态来计算最大利润。 188. 买卖股票的最佳时机 IV:最多进
2025-05-09 23:08:02
1214
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人