在此题中,官方给出的解法是分治法和动态规划算法,但是本人现在还未系统全面的学习动态规划和算法, 现阶段只能以自己的思想去做,以下为本人的两种做法:
一,暴力遍历
int maxSubArray(int* nums, int numsSize){
int i=0,sum=*(nums);
while(i<=numsSize-1)
{
for(;i<numsSize;i++)
{
if(nums[i]>sum)//主要是对全为负的情况的处理
sum=nums[i];
if(*(nums+i)<=0)
{
continue;
}
break;
}
if(i>=numsSize-1||numsSize==1)
break;
nums[i+1]=nums[i]+nums[i+1];
i++;
}
return sum;
}
虽理解起来复杂一点,但是整体只需遍历一次。如果数组开头是负数,可以直接跳过,因为将其与下一个数相加时不论怎么样都会拉低“和”,所以其肯定不是我们要找的。然后以此类推,直到碰到数组中的第一个正数(数组中数字全为负数的情况我们之后进行讨论)。碰到正数的时候我们可以判断,其与下一个数相加是否小于0,若小于0,则将这两数之和看成一个负数,则和之前的情况一样处理。
但是这个方法实在过于复杂,特别是当数组全为负等极端情况,需要做出的额外的思考特别多 ,但是这里归零之后不用再将sum归零重置,因为continue已经相当于归零了。
然后我们进一步思考,既然我们知道为只要前一段数字和为0,则其再相加反而无益,那我们就应该将其全部舍弃,但是,在这一段数字和变成零之前,最大和可能已经出现,所以我们要时刻比较sum与max的大小,这就是第二种解法:
二,暴力遍历(优化)
int maxSubArray(int* nums, int numsSize){
int i=0,sum=0,max=nums[0];
for(i=0;i<numsSize;i++)
{
sum+=nums[i];
if(sum>max)
{
max=sum;
}
if(sum<=0)
{
sum=0;
}
}
return max;
}
一旦出现sum<0的情况,应当将sum置为0,重新开始寻找,其实就是第一种方法的简化法,但是更好理解。