Kadane算法与前缀和:二维矩阵最大子矩阵和的高效解法
1. 项目概述从一维到二维的“最大和”探索在数据处理和算法面试中我们经常遇到一个经典问题在一个一维数组中如何找到和最大的连续子数组这个问题有一个优雅的解决方案——Kadane算法。但现实世界的数据往往是多维的比如一张图像、一个电子表格或者一个游戏地图。这时问题就升级了如何在一个二维矩阵中找到和最大的子矩阵这不仅仅是算法竞赛中的常客更是图像处理中寻找高亮区域、金融分析中定位高收益时段区块、乃至游戏开发中计算资源富集区的核心问题。直接暴力枚举所有可能的子矩阵时间复杂度高达 O(n²m²)对于稍大些的矩阵比如1000x1000就完全不可行。我们需要更聪明的办法。今天要聊的就是将一维的Kadane算法与前缀和思想相结合高效解决“元素和最大的子矩阵”问题。核心思路是将二维问题降维打击成一维问题。我们不再直接枚举子矩阵的四个角而是枚举子矩阵的上下边界。一旦上下边界固定矩阵的每一列在这个“带状”区域内的和就可以预先计算出来形成一个一维数组。接下来对这个一维数组应用Kadane算法找到的最大子数组和就对应了在当前上下边界约束下和最大的那个子矩阵。遍历所有可能的上下边界组合取其中的最大值就是全局答案。这个方法将时间复杂度优化到了 O(n²m) 或 O(m²n)取决于遍历行还是列对于1000x1000的矩阵从天文数字般的计算量降到了十亿次级别在普通计算机上已是可解范围。理解这个组合技不仅能帮你解决LeetCode上的“最大子矩阵”这类题目更能让你深刻体会到“降维”和“空间换时间”这两种最根本的算法优化思想。2. 核心思想拆解降维打击的艺术2.1 一维基石Kadane算法精讲在进攻二维问题前必须把一维的武器磨锋利。Kadane算法用于解决“最大子数组和”问题给定数组nums找出一个具有最大和的连续子数组。最直观的想法是暴力枚举所有子数组计算其和时间复杂度O(n²)。Kadane算法的精妙之处在于其动态规划思想它将时间复杂度降至O(n)。算法核心定义两个变量current_max和global_max。current_max表示以当前元素为结尾的所有子数组中的最大和。global_max记录遍历过程中出现的全局最大和。状态转移方程这是理解动态规划的关键current_max max(nums[i], current_max nums[i])这个方程的意思是对于第i个元素以它为结尾的最大子数组和只有两种可能自立门户自己单独作为一个子数组nums[i]。融入前序接在以i-1元素结尾的那个最大子数组后面current_max nums[i]。我们选择两者中较大的那个。然后用这个新的current_max去更新global_max。一个具体的例子nums [-2, 1, -3, 4, -1, 2, 1, -5, 4]初始化cur_max nums[0] -2,glo_max -2i1:cur_max max(1, -21 -1) 1;glo_max max(-2, 1)1i2:cur_max max(-3, 1-3 -2) -2;glo_max max(1, -2)1i3:cur_max max(4, -242) 4;glo_max max(1, 4)4i4:cur_max max(-1, 4-13) 3;glo_max max(4, 3)4i5:cur_max max(2, 325) 5;glo_max max(4, 5)5i6:cur_max max(1, 516) 6;glo_max max(5, 6)6... 最终glo_max 6对应子数组[4, -1, 2, 1]。注意很多初学者会混淆“以当前元素结尾”和“全局最优”。current_max是局部视角必须包含当前元素global_max是全局视角。Kadane算法通过维护这个局部最优巧妙地避免了重复计算。2.2 二维关键前缀和思想的应用现在来到二维矩阵。假设我们有一个m行n列的矩阵matrix。前缀和Prefix Sum是一种预处理技术能在O(1)时间内求出任意子矩阵的和。我们定义一个二维前缀和数组preSum其中preSum[i][j]表示原矩阵中从(0,0)到(i-1, j-1)这个子矩阵的元素和通常让索引从1开始以避免边界判断。递推公式preSum[i][j] matrix[i-1][j-1] preSum[i-1][j] preSum[i][j-1] - preSum[i-1][j-1]这个公式可以理解为当前格子的值加上左边矩形的和加上上边矩形的和再减去左上角矩形被重复加了一次的部分。查询子矩阵 (r1, c1) 到 (r2, c2) 的和sum preSum[r21][c21] - preSum[r1][c21] - preSum[r21][c1] preSum[r1][c1]原理类似用大矩形减去左边和上边不需要的矩形再加回多减去的左上角小矩形。然而在“最大子矩阵和”问题中我们并不直接使用这个二维前缀和去枚举所有子矩阵那样还是O(n²m²)。我们用它来做一个更高效的事情快速计算列和。2.3 组合技固定边界化二维为一维这是整个算法的灵魂所在。我们不去想子矩阵的左右边界而是先思考它的上下边界row_top和row_bottom。枚举上下边界我们用两层循环遍历所有可能的row_top(从0到m-1) 和row_bottom(从row_top到m-1)。压缩列对于每一对固定的上下边界我们计算矩阵中每一列在这个行范围内的和。这就得到了一个长度为n的一维数组col_sum。如何快速计算col_sum[j]第j列从row_top到row_bottom的和这里就是前缀和发挥作用的地方。如果我们有按列构建的一维前缀和或者巧妙地利用原矩阵可以在O(1)时间内得到。更通用的方法是在枚举上边界时初始化一个全零的col_sum数组然后随着下边界下移不断将新的一行数据累加到col_sum中。一维求解现在我们有了一个一维数组col_sum它的每个元素代表了原矩阵中一个“列条”的和。在这个数组上应用Kadane算法得到的结果就是在当前上下边界约束下能获得的最大子矩阵和。这个子矩阵的左右边界就是Kadane算法找出的那个最大子数组的起始和结束位置。全局比较记录所有上下边界对应的最大和中的最大值即为最终答案。时间复杂度分析枚举上下边界是 O(m²)对于每一对边界计算col_sum是 O(n)累加一行运行Kadane算法是 O(n)。所以总复杂度是 O(m² * n)。如果 m n我们可以选择枚举左右边界将矩阵转置处理使复杂度变为 O(n² * m)。总之复杂度是 O(min(m, n)² * max(m, n))。3. 算法实现与代码详解理解了思想我们来看具体实现。这里提供Python和Java两种常见语言的实现并附上逐行解析。3.1 Python实现def max_submatrix_sum(matrix): 计算二维矩阵中元素和最大的子矩阵的和。 :param matrix: List[List[int]], 输入矩阵 :return: int, 最大子矩阵和 if not matrix or not matrix[0]: return 0 m, n len(matrix), len(matrix[0]) max_sum float(-inf) # 初始化全局最大和为负无穷 # 枚举上边界 top_row for top_row in range(m): # 初始化一个数组用于存储从top_row到底部某一行时每一列的和 col_sum [0] * n # 枚举下边界 bottom_row for bottom_row in range(top_row, m): # 将当前行bottom_row的每个元素加到对应的col_sum中 for col in range(n): col_sum[col] matrix[bottom_row][col] # 在当前col_sum数组上应用Kadane算法 # Kadane算法开始 current_max col_sum[0] best_max col_sum[0] for i in range(1, n): # 关键状态转移以i结尾的最大子数组和 current_max max(col_sum[i], current_max col_sum[i]) # 更新全局遇到的最大值 best_max max(best_max, current_max) # Kadane算法结束 # 用当前上下边界下的最大和更新全局答案 max_sum max(max_sum, best_max) return max_sum # 测试用例 matrix [ [1, 2, -1, -4, -20], [-8, -3, 4, 2, 1], [3, 8, 10, 1, 3], [-4, -1, 1, 7, -6] ] print(f最大子矩阵和为: {max_submatrix_sum(matrix)}) # 输出应为 29 (子矩阵从(1,2)到(3,3))代码解析与注意事项边界处理首先检查矩阵是否为空这是鲁棒性的基础。col_sum的复用这是性能关键。col_sum数组在每次更换上边界 (top_row) 时被重置。当bottom_row下移时我们不是重新计算所有列从top_row到bottom_row的和而是简单地将bottom_row这一行的值累加到col_sum上。这避免了重复计算将计算列和的操作均摊到了O(1)。Kadane算法的嵌入对于每个压缩后的一维数组col_sum我们都完整运行一次Kadane算法。注意current_max和best_max的初始化是col_sum[0]而不是0因为子数组至少包含一个元素最大和也可能是负数。负数的处理算法天然支持矩阵中包含负数的情况。全局最大和max_sum初始化为负无穷 (float(-inf))确保了即使所有数都是负数也能正确返回其中最大的那个即最小的负数。3.2 Java实现public class MaxSubmatrixSum { public static int maxSubmatrixSum(int[][] matrix) { if (matrix null || matrix.length 0 || matrix[0].length 0) { return 0; } int m matrix.length; int n matrix[0].length; int maxSum Integer.MIN_VALUE; // 枚举上边界 for (int top 0; top m; top) { int[] colSum new int[n]; // 存储列累积和 // 枚举下边界 for (int bottom top; bottom m; bottom) { // 将当前行累加到colSum中 for (int col 0; col n; col) { colSum[col] matrix[bottom][col]; } // 在colSum上运行Kadane算法 int currentMax colSum[0]; int bestMax colSum[0]; for (int i 1; i n; i) { currentMax Math.max(colSum[i], currentMax colSum[i]); bestMax Math.max(bestMax, currentMax); } // 更新全局最大和 maxSum Math.max(maxSum, bestMax); } } return maxSum; } public static void main(String[] args) { int[][] matrix { {1, 2, -1, -4, -20}, {-8, -3, 4, 2, 1}, {3, 8, 10, 1, 3}, {-4, -1, 1, 7, -6} }; System.out.println(最大子矩阵和为: maxSubmatrixSum(matrix)); // 输出 29 } }Java实现要点使用Integer.MIN_VALUE初始化maxSum。在内存管理上每次外层循环top都会新建一个colSum数组对于JVM来说这是轻量级操作。也可以复用同一个数组但在每次top循环开始时用Arrays.fill(colSum, 0)清零性能差异不大新建的方式逻辑更清晰。算法逻辑与Python版本完全一致体现了其核心思想与语言无关。3.3 扩展如何记录子矩阵位置上述代码只返回了最大和。在实际问题中我们常常还需要知道这个和最大的子矩阵具体在哪里即它的左上角和右下角坐标。我们可以在Kadane算法中增加跟踪索引的逻辑。修改思路 在Kadane算法中当current_max取col_sum[i]自立门户时意味着一个新的潜在子数组开始了我们记录这个起始点start i。当best_max被current_max更新时我们记录下此时的start和当前索引i作为当前一维数组最优子数组的区间[best_start, i]。这个区间对应到二维top和bottom是已知的best_start和i就是左右边界。我们需要在全局更新max_sum时同步更新记录这些坐标。def max_submatrix_with_position(matrix): m, n len(matrix), len(matrix[0]) max_sum float(-inf) final_top final_bottom final_left final_right -1 for top in range(m): col_sum [0] * n for bottom in range(top, m): for col in range(n): col_sum[col] matrix[bottom][col] # 带位置跟踪的Kadane算法 current_max col_sum[0] best_max col_sum[0] cur_start 0 best_start 0 best_end 0 for i in range(1, n): if col_sum[i] current_max col_sum[i]: current_max col_sum[i] cur_start i # 自立门户新的开始 else: current_max current_max col_sum[i] if current_max best_max: best_max current_max best_start cur_start best_end i # 更新全局最优解及其位置 if best_max max_sum: max_sum best_max final_top top final_bottom bottom final_left best_start final_right best_end return max_sum, (final_top, final_left), (final_bottom, final_right) # 测试 max_sum, top_left, bottom_right max_submatrix_with_position(matrix) print(f最大和: {max_sum}) print(f子矩阵左上角: {top_left}, 右下角: {bottom_right})实操心得在实现带位置跟踪的Kadane时cur_start的更新逻辑是关键。它只在“自立门户”时更新而在“融入前序”时保持不变。这确保了best_start指向的是真正使best_max达到最大的那个子数组的起始点而不是中间某个更早点。4. 性能分析与优化边界4.1 时间复杂度与空间复杂度时间复杂度O(m² * n) 或 O(n² * m)取两者中较小者。这源于两层循环枚举边界O(min(m,n)²)和内部对另一维度的线性扫描及Kadane算法O(max(m,n))。空间复杂度O(n) 或 O(m)用于存储列累积和数组col_sum。这是非常高效的空间使用。与暴力枚举法的 O(m²n²) 相比这是一个巨大的飞跃。例如对于200x200的矩阵暴力法需要约160亿次运算而本算法仅需约800万次快了四个数量级。4.2 潜在优化场景与局限全正数矩阵如果矩阵中所有元素都是正数那么最大子矩阵就是整个矩阵本身。可以在预处理时做一个快速检查但通常没必要。稀疏矩阵当矩阵中大部分元素为零时上述算法仍有优化空间。我们可以只记录非零元素的位置在累加col_sum和进行Kadane时跳过大量零值操作。但对于一般情况优化收益不明显。极限矩形形状如果问题限制子矩阵必须是正方形或者长宽比在一定范围内算法需要调整。例如找最大和正方形通常使用动态规划定义dp[i][j]为以(i,j)为右下角的最大正方形边长并将和的信息融入其中复杂度可降至O(mn)。数据流场景如果矩阵是逐行流式到达的无法随机访问所有行我们依然可以应用此算法。我们维护一个col_sum数组每新到一行就累加并运行一次Kadane算法同时记录从历史所有上边界到当前行产生的最大值。这需要额外空间来记录历史最佳状态但思路相通。算法的局限在于其理论下限。对于“最大子矩阵和”问题是否存在比 O(min(m,n)² * max(m,n)) 更优的算法这是一个有趣的理论问题。在一些特殊情况下如矩阵元素有范围限制可能有更优解但在通用情况下当前的复杂度被认为是接近最优的。5. 实战应用与问题排查5.1 典型应用场景图像分析与计算机视觉在灰度图像中像素值可以看作矩阵。寻找最大和子矩阵可用于定位图像中最亮的区域例如寻找光源、高光反射或者在某些滤波和特征提取中。金融数据分析一个表格行代表时间天列代表不同的股票或产品值代表每日收益。最大和子矩阵对应着在某个时间段内、某几个产品上获得的最大总收益区间。游戏开发在策略类或模拟经营游戏中地图资源分布可以用矩阵表示。寻找最大和子区域可以帮助玩家或AI快速定位资源富集区用于规划采集或建造。生物信息学在基因序列或蛋白质结构的数值化分析中寻找具有某些特征最大累积得分的区域。5.2 常见问题与调试技巧在实现和应用该算法时可能会遇到以下典型问题问题现象可能原因排查与解决思路结果始终为0或初始值矩阵为空或max_sum初始化错误检查输入矩阵有效性。确保max_sum初始化为Integer.MIN_VALUE或float(-inf)而不是0。结果比预期小尤其是全负数矩阵Kadane算法内部best_max初始化错误确保current_max和best_max初始化为col_sum[0]而不是0。对于全负数矩阵正确结果应是最大的那个负数。算法在较大矩阵上超时时间复杂度太高或实现有误确认矩阵规模。对于1000x1000的矩阵O(n³)算法如错误的三重循环必然超时。检查自己的实现是否是标准的O(m²n)。使用性能分析工具定位热点。找到的子矩阵位置不对位置跟踪逻辑有bug重点调试Kadane算法中的cur_start更新逻辑。打印出每次best_max更新时的top,bottom,best_start,best_end与手动计算的小规模案例对比。列累加和col_sum计算错误循环边界或累加逻辑错误对于每一对(top, bottom)col_sum应累加第top行到第bottom行。确保内层循环for col in range(n)正确累加了matrix[bottom][col]。调试小技巧从小开始用一个2x2或3x3的矩阵手动计算所有子矩阵的和与程序输出对比。打印中间状态在关键步骤如每次更新col_sum后、每次Kadane算法运行后打印出数组内容观察其变化是否符合预期。使用可视化工具对于图像类应用可以将找到的最大子矩阵在原图上用矩形框标出直观判断是否正确。5.3 边界条件与异常处理空矩阵或单元素矩阵函数开始时应进行检查返回0或该元素值。所有元素为负数算法应能正确处理返回最大的那个负数。数值溢出如果矩阵元素值很大累加可能导致整数溢出在Java的int或C的int中。在实际生产中根据数据范围考虑使用long或BigInteger。非矩形输入确保输入是一个“整齐”的二维数组即每一行的长度相同。将Kadane算法与前缀和思想结合解决最大子矩阵问题是一个经典的“降维”案例。它教会我们的不仅是解决一个具体问题更是一种思维方式面对复杂的高维问题能否通过固定某些维度将其转化为熟悉的低维问题这种思路在动态规划、状态压缩等领域无处不在。理解并掌握这个组合技你的算法工具箱里就又多了一件应对二维数据范围查询与极值问题的利器。下次再遇到类似问题不妨先想想能不能把它“压扁”了再看

相关新闻

Web应用故障排查:如何精准定位前后端问题

Web应用故障排查:如何精准定位前后端问题

1. 从一次真实的线上故障说起那天下午,团队刚上线一个新功能,用户反馈就炸了。核心页面加载不出来,一片空白。产品经理、运营、老板的消息像雪花一样飞过来,压力瞬间拉满。作为测试,或者任何一个接到排查任务的工程师&…

2026/8/6 6:20:44 阅读更多 →
你的AI品牌故事正在稀释品牌资产!——2024年最新《品牌语义一致性评估模型》首发

你的AI品牌故事正在稀释品牌资产!——2024年最新《品牌语义一致性评估模型》首发

更多请点击: https://kaifayun.com 第一章:你的AI品牌故事正在稀释品牌资产!——2024年最新《品牌语义一致性评估模型》首发 当大模型生成的文案在官网、社交媒体、客服对话中高频复用却风格割裂,品牌人格正悄然坍缩。2024年Q1&a…

2026/8/6 6:19:44 阅读更多 →
为什么大厂面试官不再问SQL题?(2024数据分析岗能力评估新规:AI协同分析力占权重68%)

为什么大厂面试官不再问SQL题?(2024数据分析岗能力评估新规:AI协同分析力占权重68%)

更多请点击: https://codechina.net 第一章:AI学数据分析 人工智能正以前所未有的深度融入数据分析全流程,从数据清洗、特征工程到模型解释,AI不再仅是分析结果的使用者,而是主动参与建模决策的协作者。现代数据分析工…

2026/8/6 6:19:44 阅读更多 →

最新新闻

Pandas数值运算与缺失值处理:从原理到实战的避坑指南

Pandas数值运算与缺失值处理:从原理到实战的避坑指南

1. 项目概述:为什么数值运算与缺失值处理是Pandas的基石如果你用Pandas做过数据分析,大概率遇到过这两种情况:一是想对几列数据做点加减乘除,结果发现因为数据类型不对,要么报错要么结果全是NaN;二是数据里…

2026/8/6 7:08:11 阅读更多 →
OpenClaw:本地AI智能体基座部署与开发实战指南

OpenClaw:本地AI智能体基座部署与开发实战指南

1. 项目概述:从“云依赖”到“本地自治”的范式转移如果你是一名独立开发者,或者是一个小型团队的负责人,过去几年里,你大概率经历过这样的场景:为了给项目增加一个智能对话功能,你开始调研各大云厂商的AI服…

2026/8/6 7:08:11 阅读更多 →
Flask Session伪造与Unicode欺骗:从原理到实战的Web安全攻防

Flask Session伪造与Unicode欺骗:从原理到实战的Web安全攻防

1. 项目概述:一次关于身份认证的“魔术”在Web安全的世界里,身份认证机制往往是攻防双方博弈的核心地带。今天要聊的这个靶场题目——BUUCTF上的[HCTF 2018]admin1,就是一个绝佳的案例。它没有复杂的RCE(远程代码执行)…

2026/8/6 7:08:11 阅读更多 →
关于网站建设的图片:那些被低估的视觉灵魂,如何决定你的流量生死

关于网站建设的图片:那些被低估的视觉灵魂,如何决定你的流量生死

咱们今天不聊那些虚头巴脑的技术参数,也不谈什么晦涩难懂的后端架构,咱们就坐下来,泡杯茶,聊聊那个在网站建设里最容易被人忽视,却又能一眼定生死的东西。对,就是图片。你可能听过那句话:“颜值即正义。”在互联网时代,这句话简直就是真理。当用户第一次点进你的网站,…

2026/8/6 7:08:11 阅读更多 →
为什么我不再让一个 Agent 做所有事情?Hermes 多 Profile 实战

为什么我不再让一个 Agent 做所有事情?Hermes 多 Profile 实战

前两篇,我们分别解决了两个问题。第一篇,把 Hermes 从一个聊天机器人,改造成了一个可以 24 小时持续工作的 AI 工作台。第二篇,把多个 Agent 之间的协作,从"群聊接话"变成了基于 Kanban 的任务管理&#xff…

2026/8/6 7:08:11 阅读更多 →
虚拟机CPU超配问题解析:从超量分配到性能调优的实战指南

虚拟机CPU超配问题解析:从超量分配到性能调优的实战指南

1. 项目概述:当虚拟机CPU配置“超标”时,我们到底在解决什么?在虚拟化运维和开发测试的日常工作中,我猜不少朋友都遇到过这个让人心头一紧的弹窗或提示:你试图为虚拟机分配的虚拟处理器(vCPU)数…

2026/8/6 7:07:11 阅读更多 →

日新闻

深入解析LimboAI C++内核:架构设计与性能优化实战

深入解析LimboAI C++内核:架构设计与性能优化实战

1. 项目概述:为什么我们需要深入LimboAI的C内核?如果你是一名使用Godot引擎的游戏开发者,尤其是对AI行为逻辑有较高要求的项目,那么LimboAI这个名字你大概率不会陌生。它作为Godot 4生态中一个备受瞩目的行为树与状态机插件&#…

2026/8/6 0:00:06 阅读更多 →
Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

1. 项目概述与核心思路大家好,我是老张,一个在游戏开发一线摸爬滚打了十多年的老码农。今天咱们接着聊《空洞骑士》风格2D动作游戏的Demo制作。上一期我们搭好了基础框架,处理了角色移动和碰撞,这一期,我们要让游戏世界…

2026/8/6 0:00:06 阅读更多 →
被动防火门市场前景发展趋势

被动防火门市场前景发展趋势

被动防火门依靠材质结构、密闭构造阻隔烟火蔓延,无需电控启动,是建筑被动消防系统核心构件,行业依托新规管控、城市更新、工业安全升级迎来稳定扩容,整体朝着合规化、专项化、低碳化、智能化方向发展。现阶段 GB12955‑2024 新版国…

2026/8/6 0:00:06 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/5 21:00:14 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →