求连续子数组的最大和
题目描述
给定一个整形数组,有正数也有负数,数组中连续一个或多个组成一个子数组,求所有子数组的和的最大值,要求时间复杂度为O(n);
测试用例
给定数组
{1,-2,3,10,-4,7,2,-5}
输出
18
思路分析
可以用动态规划的思想来完成:
用一个数组max[i]来存以第i个数字结尾的子数组的最大值
则max[i]有以下几种情况:
1.当i=0时,max[i] = data[i];
例如max[0] = 1;
2.当max[i-1]<0时,max[i] = data[i];
例如,由第4种情况得到max[2-1] = max[1] = -1<0,则max[2] = data[2] = 3;
3.当max[i-1]+data[i]<=0 && max[i-1]+data[i]<data[i]时,max[i] = data[i];
例如存在数组{-1,-10},
当i=1时:max[i-1]+data[i]=-1+(-10) = -11<0 && max[i-1]+data[i] = -11 < data[i] =-10,
所以max[1] = -10;
4.其他情况,max[i] = max[i-1]+data[i];
例如max[1] = max[0]+data[1] = -1;
初始化数组max[]的同时,用一个变量保存一下前i个数里面的子数组的和的最大值,
max[]初始化结束后,也就得到了连续子数组的最大和
根据以上思路,Java 代码如下:
public class Solution {
public int FindGreatestSumOfSubArray(int[] array) {
int[] max= new int[array.length];
max[0] = array[0];
int maxNum = Integer.MIN_VALUE;
for(int i = 1; i<array.length;i++){
if(max[i-1]<0)
max[i] = array[i];
else if(maxx[i-1]+array[i]<=0 && max[i-1]+array[i]<array[i]){
max[i] = array[i];
}else{
max[i] = max[i-1]+array[i];
}
if(maxNum<max[i])
maxNum = max[i];
}
return maxNum;
}
}
分类:
算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律