Leetcode 最大子数组乘积

探讨了如何通过动态规划策略求解给定数组中子数组累乘的最大乘积问题,考虑到正负数和零的影响,使用两个数组分别记录以每个元素结尾的最大和最小子数组乘积。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

给定一个double类型的数组arr,其中的元素可正可负可0,返回子数组累乘的最大乘积。例如arr=[-2.5,4,0,3,0.5,8,-1],子数组[3,0.5,8]累乘可以获得最大的乘积12,所以返回12。

 

由于可能出现0 负数  负负得正情况

采取动态规划策略   记录以arr[i]结尾的子数组最大以及最小乘积

    double max_dp[10000];//存放以i结尾最大子数组乘积
    double min_dp[10000];//存放以i结尾最小子数组乘积

那么动态转移中

下一次的最值 一定在 自身,自身与之前最大乘积, 自身与之前最小乘积   中取得

double maxProduct(vector<double> arr) {

        max_dp[0]=arr[0];
        min_dp[0]=arr[0];
        double max_=arr[0];

        for(int i=1;i<arr.size();i++)
        {
            //最大乘积  在自身   自身与之前最大乘积   自身与之前最小乘积(负负得正情况)  三者中取得
            max_dp[i]=max(arr[i],max(arr[i]*max_dp[i-1],arr[i]*min_dp[i-1]));
            min_dp[i]=min(arr[i],min(arr[i]*max_dp[i-1],arr[i]*min_dp[i-1]));
            if(max_dp[i]>max_)
                max_=max_dp[i];
 
        }
      return max_;

    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值