LeetCode热题100 乘积最大子数组

题目描述

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续 子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

测试用例的答案是一个 32-位 整数。

请注意,一个只包含一个元素的数组的乘积是这个元素的值。

示例 1:

输入 : nums = 2,3,-2,4
输出 : 6
解释: 子数组 2,3 有最大乘积 6。

示例 2:

输入 : nums = -2,0,-1
输出 : 0
解释: 结果不能为 2, 因为 -2,-1 不是子数组。

提示:

1<=nums.length<=2∗1041 <= nums.length <= 2 * 10^41<=nums.length<=2∗104

-10 <= numsi <= 10

nums 的任何子数组的乘积都 保证 是一个 32-位 整数

思路

前后缀秒了,我们用0将数组分成多个小数组,很明显答案要么是某个前缀,要么是某个后缀。

利用反证法,如果是中间部分,说明不能和左边的连接,那么左边的结果是负数,同理说明右边结果是负数,如果两边都是负数,那么是可以连接成正数的,与中间部分是答案相矛盾。

因此答案要么是某个前缀,要么是某个后缀。

代码

cpp 复制代码
class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int n = nums.size();
        int mx = INT_MIN;
        int pre = 0;
        int suf = 0;
        for(int i = 0; i < n; ++i)
        {
            if(pre == 0) pre = 1;
            pre *= nums[i];
            mx = max(mx, pre);
        }
        for(int i = n - 1; i; --i)
        {
            if(suf == 0) suf = 1;
            suf *= nums[i];
            mx = max(mx, suf);
        }
        return mx;
    }
};
相关推荐
学计算机的计算基3 分钟前
操作系统内存管理全解:虚拟内存、页表、COW、malloc、OOM一篇搞定
java·笔记·算法
tachibana27 分钟前
hot100 前 K 个高频元素(347)
java·数据结构·算法·leetcode
小保CPP12 分钟前
OpenCV C++提取webp动图里的图片
c++·人工智能·opencv·计算机视觉
To_OC8 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode
炸膛坦客9 小时前
单片机/C/C++八股:(二十六)IIC 专题(I²C)---- 上集
c语言·c++·单片机
旖-旎9 小时前
LeetCode 518:零钱兑换||(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
To_OC10 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
Henry Zhu12310 小时前
C++中的特殊成员函数与智能指针
c++
delishcomcn10 小时前
AI视觉识别+分切算法:电化铝缺陷检测与裁切一体化解锁
人工智能·算法
触底反弹11 小时前
深入理解大模型采样:Temperature、Top-K、Top-P 的原理与实战
人工智能·算法·面试