名企中等——子数组最大乘积

https://www.nowcoder.com/practice/9c158345c867466293fc413cff570356?tpId=188&&tqId=36848&rp=1&ru=/ta/job-code-high-week&qru=/ta/job-code-high-week/question-ranking


题目描述
给定一个double类型的数组arr,其中的元素可正可负可0,返回子数组累乘的最大乘积。

示例1
输入

[-2.5,4,0,3,0.5,8,-1]
返回值

12.00000


分析:从给出的例子看,要求子数组必须连续。同时由于元素正负性不确定,应同时记录最大最小值

iMax、iMin分别用来记录以前一个数结尾的子数组的最大乘积、最小乘积。

  1. arr[i]>0: iMax = std::max(arr[i], arr[i]*iMax);
  2. arr[i]<0: iMax = std::max(arr[i], arr[i]*iMin); // 相当于是负负得正
    所以,当arr[i]<0的时候,交换iMax和iMin即可。
    public double maxProduct(double[] arr) {
        if(null == arr || arr.length == 0){
            return 0;
        }


        // 子数组的含义,看所给例子应该是要连续才可以?
        // 表示当前下标值的子数组内,最大的正负值
        double max = 1;
        double min = 1;
        double result = arr[0];


        for(int i = 0; i < arr.length; i++){
            if(arr[i] < 0){
                double temp = min;
                min = max;
                max = temp;
            } 
            max = Math.max(arr[i], max*arr[i]);
            min = Math.min(arr[i],min*arr[i]);
            result = Math.max(result,max);
            
        }
        return result;

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值