LeetCode--53.最大子数组和

LeetCode--53.最大子数组和

在此题中,官方给出的解法是分治法和动态规划算法,但是本人现在还未系统全面的学习动态规划和算法, 现阶段只能以自己的思想去做,以下为本人的两种做法:

一,暴力遍历

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,重新开始寻找,其实就是第一种方法的简化法,但是更好理解。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值