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;
    }
};
相关推荐
Fuyo_11198 分钟前
深入解析 C++ unordered_set 与 unordered_map 的核心特性与性能实战
开发语言·c++
码匠许师傅12 分钟前
【C++三方组件】FFmpeg:音视频处理的瑞士军刀
c++·ffmpeg·音视频
SZYSK26 分钟前
OpenHarmony 上读卡、推理和双屏刷新抢 CPU:核验机与消费机的调度差
物联网·算法·harmonyos·1024程序员节
ShineWinsu39 分钟前
对于Qt:QPushButton常见属性的解析
开发语言·c++·qt·api·gui·按钮·qpushbutton
Ivanqhz44 分钟前
MoE + LLM 应用
数据库·人工智能·pytorch·python·深度学习·算法·1024程序员节
Lhan.zzZ1 小时前
用 Qt 构建线程安全的通讯静态库:从线程亲和性到完整工程
c++·vscode·qt·tcp/ip·udp
lpfasd1231 小时前
推荐算法进化史
算法·机器学习·推荐算法
xiaoye-duck1 小时前
《C++ 项目:手写大模型接入 SDK》DeepSeek接口设计(上):初始化和全量响应
开发语言·网络·c++·语言模型
Pniubi1 小时前
力扣543二叉树的直径(深度优先搜索法(递归))
算法·leetcode·职场和发展
fpcc1 小时前
跟我学c++中级篇—streambuf在glog中的应用分析
开发语言·c++