给你一个整数数组 nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
时间复杂度O(n)动态规划思路:
1、定义子状:在每一个状态dp[i]中,元素nums[i]必定会被选中,然后根据dp[i-1]的状态考虑是否要包括nums[i-1]。
2、转化为子问题:以第1个元素结尾的最大子数组和是多少
以第2个元素结尾的最大子数组和是多少
以第3个元素结尾的最大子数组和是多少
以第4个元素结尾的最大子数组和是多少
以第5个元素结尾的最大子数组和是多少
最终找出最大值即可。
int maxSubArray(int* nums, int numsSize){
int count=nums[0];
int max=count;
for(int i=1;i<numsSize;i++){
if(count<0&&nums[i]<=0)
count=nums[i];
else if(count<0&&nums[i]>=0)
count=nums[i];
else
count+=nums[i];
max=max>count?max:count;
}
return max;
}
有后效性:当前状态受到前面状态的影响,也对后续状态产生影响
无后效性:当前状态与前面状态无关,也不会对后续状态产生影响
显然本体的子问题是无后效性的。