题解 | # NC83 子数组最大乘积#

子数组最大乘积

http://www.nowcoder.com/practice/9c158345c867466293fc413cff570356

其实想要知道一个子数组的最大乘积首先要意识到其实子数组的乘积可以由前缀乘积除以某个更小前缀的乘积来得到,需要注意的是碰到0得重新记录前缀乘积为1,因为答案子数组不可能跨过0的。

public double maxProduct(double[] arr) {
        if(arr==null||arr.length<=0) return 0;
        //保留一个距离0最近的负数,一个距离0最近的正数
        Double inMax = null;
        Double min = null;
        double curMulSum = 1.0;
        double res = Integer.MIN_VALUE;
        for(int i = 0;i<arr.length;i++){
            curMulSum *=arr[i];
            res = Math.max(curMulSum,res);
            if(inMax!=null){
                res = Math.max(res,curMulSum/inMax);
            }
            if(min!=null){
                res = Math.max(res,curMulSum/min);
            }
            if(curMulSum==0){
                inMax =null;
                min = null;
                curMulSum = 1;
            }else if(curMulSum<0){
                inMax = inMax==null?curMulSum:Math.max(inMax,curMulSum);
            }else{
                min = min==null?curMulSum:Math.min(min,curMulSum);
            }
        }
        return res;
    }
waigo的刷题之路 文章被收录于专栏

收录平时刷题的题解

全部评论

相关推荐

07-02 10:44
门头沟学院 C++
码农索隆:太实诚了,告诉hr,你能实习至少6个月
点赞 评论 收藏
分享
05-22 12:44
已编辑
门头沟学院 golang
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务