OJ——动态规划——Maximum_Subarray

提前准备的知识(虽然后面没用到):

 1.动态规划正常是要开数组的,所以相关数据类型的抉择是个问题:

    short 2bytes;          大约3万           5位数字

    int 4bytes;               大约20亿        10位数字

    long 4bytes;            大约20亿        10位数字

    long long 8bytes;    ***                    19位数字

按照前辈经验:在开数组时常常用int或者long long,自行根据题目数据选择(指标数字位数最有用)。

。。。。。。。。。。。。。。。。。。。。。。。。。

动态规划的思考:

2.动态规划的步骤:

①开数组

②将状态转移方程翻译成代码

    a:初始化

    b:根据状态转移方程编写:条件语句,循环语句

    c:返回要求的值

 

3.从动态规划的角度思考:

    (事实上,不参照其他代码自己根本想不出动态规划是要怎么做,现在努力的从动态规划的角度思考。)

   a. 最后生成的最大的子数组的值是由上一个子数组的基础上建立的。 初始化从第一个数开始。

   b.思考状态转移方程:如果之前的总值小于零,那么那一段就可以舍弃了;如果之前的总和大于零则允许和这次相加。

   c.在过程中记录最大值,在最大值更新的条件下,记录数组范围。

  

4.代码:

int maxSubArray(vector<int>& nums) {
        
        int max_sum=nums[0],sum=nums[0]; //初始化  max_sum WA过


    for(int i=1;i<nums.size();i++)
    {
        if(sum>0)
        {
            sum+=nums[i];
            //start=i;  //只要总和大于零就记录开头
        }
        else  //前面总和是负值就全部舍弃
        {
            sum=nums[i];
        }

        if(sum>max_sum)  //在最大值更新的时候记录结尾
        {
            max_sum=sum;
            //end=i;
        }
    }
        
    
    return max_sum;
    }

时间复杂度分析:事实上就只是一个循环:n

WA:总数组只有一个的情况要考虑到

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值