leedcode做题总结,动态规划II(Maximum Subarray,Maximum Product Subarray)

这两道题都作出来了,但是代码冗长,于是我上网搜了一下,发现了非常简洁的做法,特此链接

http://blog.csdn.net/linhuanmars/article/details/21314059

http://blog.csdn.net/linhuanmars/article/details/39537283

主要思路是不使用矩阵,使用local和global变量来记录包含当前元素的局部最优解和到目前为止的全局最优解。

public int maxSubArray(int[] A) {
    if(A==null || A.length==0)
        return 0;
    int global = A[0];
    int local = A[0];
    for(int i=1;i<A.length;i++)
    {
        local = Math.max(A[i],local+A[i]);
        global = Math.max(local,global);
    }
    return global;
}

public class Solution {
    public int maxProduct(int[] A) {
        if(A==null || A.length==0)  
        return 0;  
    if(A.length == 1)  
        return A[0];  
    int max_local = A[0];  
    int min_local = A[0];  
    int global = A[0];  
    for(int i=1;i<A.length;i++)  
    {  
        int max_copy = max_local;  
        max_local = Math.max(Math.max(A[i]*max_local, A[i]), A[i]*min_local);  
        min_local = Math.min(Math.min(A[i]*max_copy, A[i]), A[i]*min_local);  
        global = Math.max(global, max_local);  
    }  
    return global;
        
    }
}

下面是我对第一题的解法,复杂度一样就是代码冗长

public class Solution {
    public int maxSubArray(int[] A) {
        if(A.length==0) return 0;
        int max=A[0],record=0;
        boolean tmp=false;
        for(int i=0;i<A.length-1;i++){
            if(!tmp&&max<=0&&A[i]>max)max=A[i];
            if(!tmp&&A[i]>0){
                //start=i;
                record=0;
                tmp=true;
                
            }
            
            if(tmp&&((record+A[i]+A[i+1])>=0)){
                record+=A[i];
                max=max>record?max:record;
            }else if(tmp&&((record+A[i]+A[i+1])<0)){
                record+=A[i];
                max=max>record?max:record;
                record=0;
                tmp=false;
            }
            
        }
        if(tmp){
            record+=A[A.length-1];
            max=max>record?max:record;
        }else{
            max=max>A[A.length-1]?max:A[A.length-1];
        }
        return max;
    }
}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值