Max product subarray

这几天为了准备wap的tech interview,无意间看到了leetcode OJ,上面目前有150多道题目,粗粗浏览了一下都是质量较高的算法题,突然有了一种大一时候ACM的感觉,虽然很多都不熟悉了,还有一些从来没熟悉过...不过现在开始就是最好的时机~wap失败了还有其他国内公司的机会~


第四题: 求最大的子序列乘积 

开始的时候误入歧途,没有想到DP,currentMax和currentMin从单值变成数组问题就迎刃而解了,因为一路乘下去,下一刻只要不是当前最大(对应乘积为正)一定就是当前最小(对应乘积为负),DP方程可以这么写max(i) = max{ ai , ai * max( i - 1 ) , ai * min( i - 1 ) }, min(i) = min{ ai , ai * max( i - 1 ) , ai * min( i - 1 ) },源代码如下:

public class Solution {
    public int maxProduct(int[] A) {
        int currentMax[] = new int[99999];
        int currentMin[] = new int[99999];
        currentMax[0] = A[0];
        currentMin[0] = A[0];
        int value = currentMax[0];
       for(int i=1;i<A.length;i++)
       {
           currentMax[i] = max(max(currentMax[i-1]*A[i],A[i]),currentMin[i-1]*A[i]);
           currentMin[i] = min(min(currentMax[i-1]*A[i],A[i]),currentMin[i-1]*A[i]);
           value = max(currentMax[i],value);
       }
       return value;
    }
    
    public int max(int a,int b){
        if(a>b)return a;
        else return b;
    }
    public int min(int a,int b){
        if(a<b)return a;
        else return b;
    }
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值