给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
int maxSubArray(int* nums, int numsSize) {
int maxprocess = nums[0];
int sum = nums[0];
for (int i=1;i<numsSize;i++)
{
if(nums[i]>nums[i]+maxprocess)
maxprocess = nums[i];
else
maxprocess = nums[i]+maxprocess;
if(sum>maxprocess)
sum = sum;
else
sum = maxprocess;
}
return sum;
}
解题思想:(动态规划)
1、要用两个变量T、t,T指示末尾元素为nums[i]时的最大子序和,t则指示扩展连续子数组时的中间变量
2、当t>0时,证明可以扩展子序列,t=max{t+nums[i],nums[i]},如果t<0,证明前面子序列
被跳出,从此元素重新开始
3、比较t与T,求出不同子序列间最大的那个
4、上面的程序摘自leetcode答案,我的答案不简洁,在下面
int maxSubArray(int* nums, int numsSize) {
int *T=(int *)malloc(numsSize*sizeof(int));
int *t=(int *)malloc(numsSize*sizeof(int));
int i,temp;
t[0]=T[0]=nums[0];
for(i=1;i<numsSize;i++){
t[i]=t[i-1]+nums[i];
if(T[i-1]>0&&nums[i]<t[i])
{
if(t[i]>T[i-1])
T[i]=t[i];
else
T[i]=T[i-1];
}
else
{T[i]=nums[i];
t[i]=nums[i];
}
}
temp=T[0];
for(i=1;i<numsSize;i++){
if(temp<T[i])
temp=T[i];
}
return temp;
}