思路: 动态规划
解释: 由于要求子数组是连续的,所以每走一步就可以确定当前位置所有子数组最大和,而走到下一步时,只需要比较 “当前这个数” 与 “这个数+上一步记录的最大和” 谁更大,将更大的数保存,这个更大的数就是当前位置所有子数组最大和。因此遍历一遍数组便可确定连续子数组最大和,时间复杂度为O(n)。
class Solution {
public int maxSubArray(int[] nums) {
//1.定义动态数组,代表当前位置连续子数组最大和
int[] dp = new int[nums.length];
//2.初始化
dp[0] = nums[0];
int maxSub = dp[0];
//3.遍历递推
for(int i=1; i<nums.length; i++){
int temp = dp[i-1] + nums[i];
//4.状态转移
if(temp > nums[i]) dp[i] = temp;
else dp[i] = nums[i];
maxSub = maxSub > dp[i] ? maxSub : dp[i];
}
return maxSub;
}
}
本题同【53. 最大子数组和】
另一种解法是分治法,待补充…
版权声明:本文为yangen2018原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。