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 <= nums[i] <= 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;
    }
};
相关推荐
BirdenT2 小时前
20260519紫题训练
c++·算法
csdn_aspnet7 小时前
C语言 Lomuto分区算法(Lomuto Partition Algorithm)
c语言·开发语言·算法
谙弆悕博士8 小时前
【附C源码】从零实现C语言堆数据结构:原理、实现与应用
c语言·数据结构·算法··数据结构与算法
C+++Python9 小时前
C++ 进阶学习完整指南
java·c++·学习
sparEE10 小时前
c++值类别、右值引用和移动语义
开发语言·c++
jrrz082811 小时前
Apollo MPC Controller
c++·自动驾驶·apollo·mpc·横向控制·lateral control
gaosushexiangji11 小时前
DIC系统推荐:基于千眼狼三维数字图像相关的无人机旋翼疲劳试验全场应变与位移测量
人工智能·算法
小王C语言12 小时前
【线程概念与控制】:线程封装
jvm·c++·算法
圣保罗的大教堂13 小时前
leetcode 796. 旋转字符串 简单
leetcode
学习,学习,在学习13 小时前
Qt工控仪器程序框架设计详解(工控多仪器控制版本)
开发语言·c++·qt