题目描述
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
样例
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
算法分析
(动态规划) O(n)
-
设 f(i) 表示以第 i 个数字为结尾的最大连续子序列的 和 是多少。
-
初始化 f(0)=nums[0]
-
转移方程f(i)=max(f(i−1)+nums[i],nums[i])。可以理解为当前有两种决策,一种是将第 i 个数字和前边的数字拼接起来;另一种是第 i 个数字单独作为一个新的子序列的开始。
-
最终答案为ans=max(f(k)),0≤k<nans=max(f(k)),0≤k<n。
时间复杂度O(n)
Java代码
/*输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。*/
public class Solution {
/*f(i)表示从左到右该位置的最大序列和
* f(0) = nums[0]
* f(i) = Max【f(i - 1) + nums[i],nums[i]】
* ans=max(f(k)),0≤k<nans=max(f(k)),0≤k<n。
* */
public int maxSubArray(int[] nums) {
int[] f = new int[nums.length];
f[0] = nums[0];
int ans = f[0];
//为了重复深度遍历,使用动态规划记录该深度的值
for(int i = 1;i < nums.length;i++)
{
f[i] = Math.max(f[i - 1] + nums[i], nums[i]);
ans = Math.max(ans, f[i]);
}
return ans;
}
}