【前缀和】LeetCode 1031. 两个非重叠子数组的最大和
题目链接
思路
// TODO 先见注释
代码
class Solution {
public int maxSumTwoNoOverlap(int[] nums, int firstLen, int secondLen) {
// 求一个前缀和
for(int i = 1; i < nums.length; ++i){
nums[i] += nums[i - 1];
}
// 初始化最终最大值的初始值,初始化firstLen子数组和最大值,初始值化secondLen子数组和最大值
// 初始化后,是前缀和数组中满足当前子数组长度下最靠左边的几个元素值
int result = nums[firstLen + secondLen - 1], Lmax = nums[firstLen - 1], Mmax = nums[secondLen - 1];
for(int i = firstLen + secondLen; i < nums.length; ++i){
// 从前往后遍历数组,找长度为firstLen的子数组最大和,此时是模拟firstLen数组在secondLen数组左边
// nums[i - secondLen]是当前位置,M长度子数组之前的第一个元素
Lmax = Math.max(Lmax, nums[i - secondLen] - nums[i - firstLen - secondLen]);
// 从前往后遍历数组,找长度为secondLen的子数组最大和,此时是模拟secondLen数组在firstLen数组左边
// nums[i - firstLen]是当前位置,firstLen长度子数组之前的第一个元素
Mmax = Math.max(Mmax, nums[i - firstLen] - nums[i - firstLen - secondLen]);
// 比较firstLen在左边的最大值+最近的一个secondLen子数组和,secondLen在左边并取最大值+最近的一个firstLen子数组和
result = Math.max(result, Math.max(
Lmax + nums[i] - nums[i - secondLen], Mmax + nums[i] - nums[i - firstLen]));
}
return result;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」