连续子数组的最大和
剑指 Offer 42. 连续子数组的最大和
难度简单496
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
示例1:
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
提示:
这是简单的动规题目,自己不看题解想出来的,必须好好记录一下。
思想:
正数加起来对自身有利,负数加起来对自己有害。
边界: dp[0]=nums[0];
//第i个数字>之前的数字累加+本身。说明前面对本身的贡献为0;还不如从自己才开始, 否则大家继续一起累加
核心方程: dp[i]=Math.max(nums[i],dp[i-1]+nums[i]);
结束之后就可以遍历dp数组,找最大的数值了。
下面的代码可以优化,但是我懒得优化。继续刷题。
package com.wu.剑指;
/**
* 动态规划
*/
public class 连续子数组的最大和 {
public static void main(String[] args) {
int []nums = {-2,1,-3,4,-1,2,1,-5,4};
int maxSubArray = maxSubArray(nums);
System.out.println(maxSubArray);
}
public static int maxSubArray(int[] nums) {
int[] dp = new int[nums.length];
int max=Integer.MIN_VALUE;
dp[0]=nums[0];
for (int i=1;i<nums.length;i++){
//第i个数字 比之前的数字加上本身还大,说明前面对本身的贡献为0;还不如从自己才开始
dp[i]=Math.max(nums[i],dp[i-1]+nums[i]);
}
for (int i=0;i<nums.length;i++){
max=Math.max(dp[i],max);
}
return max;
}
}