leetcode五月每日一题 leetcode152

在这里插入图片描述
又是动态规划的题哦。这道题与最大子数组和的区别在于,两个负数乘积会为正。

所以就会想:想要正值的时候要最大的正值,想要负值的时候取最小的负值

我康的一个比较好的讲解在这里

class Solution {
public:
    int maxProduct(vector<int>& nums) {

        int n = nums.size();
        if(!n) return 0;

        int ans = nums[0];
        int premin = nums[0],premax = nums[0];
        int dpmin,dpmax;

        for( int i = 1; i < n ; ++ i){
            dpmin = min(nums[i],min(nums[i]*premin , nums[i]*premax));
            dpmax = max(nums[i],max(nums[i]*premin , nums[i]*premax));

            ans = max(dpmax,ans);
            premax = dpmax; premin = dpmin;
        }


        return ans;
        

    }
};

在这里插入图片描述
dp的速度有一点慢,但是题解区的正反求最大值的方法没看懂啊。。。

class Solution:
    def maxProduct(self, A):
        B = A[::-1]
        for i in range(1, len(A)):
            A[i] *= A[i - 1] or 1
            B[i] *= B[i - 1] or 1
        return max(max(A),max(B)) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五月的天气

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值