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;
    }
};
相关推荐
shehuiyuelaiyuehao29 分钟前
算法50,分治归并,数组中的逆序对
java·算法
风合星语1 小时前
2026 ROS 2 Lyrical C++ 入门(五):Action 实战——任务反馈、取消与超时处理
c++·机器人·ros2·异步编程·lyrical
阳明山水1 小时前
校准分位数驱动智能库存决策
人工智能·深度学习·算法·机器学习·架构
91刘仁德2 小时前
C++ 继承和多态 设计模式
c语言·c++·笔记
库玛西2 小时前
哈夫曼树与前缀编码:数据压缩的贪心核心
c语言·c++·笔记·考研
别动我齐刘海2 小时前
ROS2 Jazzy + C++ 实战路线——进阶学习3
c++·人工智能·vscode·python·算法·机器学习·机器人
zhangfeng11332 小时前
《从“人工适配“到“智能生成“:KernelSwift 跨国产芯片算子迁移全栈方案解读》 —— 强调范式跃迁和跨硬件属性,适合偏架构分析的写法
人工智能·算法·华为·ai编程·npu
0+1112 小时前
算法 --滑动窗口
c++·算法·leetcode
stolentime3 小时前
(有原题)CSP-S2026第一轮试题(附答案解析、markdown源码)
c++·csp
m0_734571763 小时前
深入理解C++ RAII
开发语言·c++