题目描述
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)
解析
- 思路:我的第一思路是滑动窗口,遍历每个子数组并计算子数组的和,但是n个数字有n(n+1)/2个子数组,时间复杂度是O(n*n),显然有更好的解决办法。
- 这道题最简单的做法是利用动态规划,后一个状态是与前一个状态有关的,根据题意得到状态转移方程是
max(f(i)) = max(f(i-1),0)+nums[i]
,所以这里将数组的nums[i]
值直接替换成计算得到的max(f(i-1))
public int maxSubArray(int[] nums) {
int dp = nums[0];
for(int i=1;i<nums.length;i++) {
nums[i]+= Math.max(nums[i-1],0);
dp = Math.max(nums[i], dp);
}
return dp;
}