连续子数组的最大和
题目描述:
输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 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数组,数组中存放的均是到当前位置为止的连续子数组的最大和。我们看代码,仔细想想就知道啦。
代码:
public class Solution {
public int FindGreatestSumOfSubArray(int[] array) {
int [] dp = new int [array.length];
dp[0] = array[0];//初始化dp数组
int res = array[0];//返回值
for (int i = 1; i < array.length; i++) {
if (dp[i - 1] < 0) {
dp[i] = array[i];//前一位dp小于0则返回自己本身
}
else {
dp[i] = dp[i - 1] + array[i];//前一位大于0则返回自身加dp前一位
}
if (res < dp[i]) {
res = dp[i];//找最大dp中的值
}
}
return res;
}
}