# 题目描述

# 思路与题解

这道题很容易陷入一个死胡同,可惜,我就陷入了~

[2,-5,-2,-4,3] 这组测试数据就很那啥,如果以我们人脑来思考,我们可以在大脑里运算一遍得出最大乘机是 24,但如果要写代码的话,在从左往右遍历的过程中,又该如何判断要放弃次最大的 20,也就是 2,-5,-2 ,从而选择 -2,-4,3 呢,这不就只能用暴力求解吗,我就陷入了这样的死胡同

看了官方题解后,我才明白关键的点在哪里,就是要分情况讨论啊,啊啊啊,因为有负号的干扰,所以我们还要多考虑一种情况,就是当前 i 如果是一个负数的话,那我就要找 i 前面的最小值,负负得正,从而也有可能问鼎最大值,所以就要维护最大子数组值和最小子数组值,这才是本题的关键呐!

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int prev = 1, mx = nums[0], mn = 1;
        for (const int &x : nums) {
            int t = max(x, max(prev * x, mn * x));
            // 此题的关键就在于要维护一个最小的子数组乘机
            mn = min(x, min(prev * x, mn * x));
            mx = max(mx, t);
            prev = t;
        }
        return mx;
    }
};
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

宇凌喵 微信支付

微信支付

宇凌喵 支付宝

支付宝