43.连续子数组的最大和
输入一个 非空 整型数组,数组里的数可能为正,也可能为负。
数组中一个或连续的多个整数组成一个子数组。
求所有子数组的和的最大值。
要求时间复杂度为 O(n)。
数据范围:
数组长度 [1,1000]。
数组内元素取值范围 [−200,200]。
样例:
输入:[1, -2, 3, 10, -4, 7, 2, -5]
输出:18
代码:
class Solution {
public int maxSubArray(int[] nums) {
//dp数组:dp[i]表示以nums[i]结尾的最大子数组和
int[] dp = new int[nums.length];
//初始化结果为极小值
int res = -0x3f3f3f3f;
//动态规划填充dp数组
for(int i = 0;i<nums.length;i++){
//第一个元素的最大子数组和就是它本身
if(i==0)dp[i] = nums[i];
//状态转移方程:
//要么将当前元素加入前一个子数组(dp[i-1]+nums[i])
//要么以当前元素作为新的子数组开头(nums[i])
else dp[i] = Math.max(dp[i-1]+nums[i],nums[i]);
}
//遍历dp数组找出最大值
for(int i = 0;i<nums.length;i++)res = Math.max(res,dp[i]);
return res;
}
}

浙公网安备 33010602011771号