JZ30 连续子数组的最大和
作者:互联网
描述
输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n).
示例1
输入:[1,-2,3,10,-4,7,2,-5]
返回值:18
说明:输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和 18。
思路
状态定义:dp[i]表示以i结尾的连续子数组的最大和。所以最终要求dp[n-1]
状态转移方程:dp[i] = max(array[i], dp[i-1]+array[i])
解释:如果当前元素为整数,并且dp[i-1]为负数,那么当然结果就是只选当前元素
技巧:这里为了统一代码的书写,定义dp[i]表示前i个元素的连续子数组的最大和,结尾元素为array[i-1]public int FindGreatestSumOfSubArray(int[] array) { int max=array[0]; int[] dp = new int[array.length]; dp[0]=array[0]; for (int i = 1; i < array.length; i++) { int newMax=dp[i-1]+array[i]; if(newMax>array[i]) dp[i]=newMax; else dp[i]=array[i]; if (dp[i]>max) max=dp[i]; } return max; }
标签:newMax,int,JZ30,连续,数组,max,array,dp 来源: https://blog.csdn.net/weixin_58070636/article/details/118946774