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;
    }
};
相关推荐
minji...1 小时前
Linux 线程同步与互斥(六) 线程安全与重入问题,死锁,线程done
linux·运维·开发语言·数据库·c++·算法·安全
wayz111 小时前
Day 16 编程实战:PCA主成分分析与技术指标降维
人工智能·算法·机器学习
探序基因1 小时前
单细胞转录组Seurat去批次-RPCA算法
算法
yuanyuan2o21 小时前
GDB 调试指南
c语言·c++·算法
流年如夢1 小时前
算法效率:复杂度原理解析
c语言·数据结构·算法
cpp_25013 小时前
P1024 [NOIP 2001 提高组] 一元三次方程求解
数据结构·c++·算法·题解·二分答案·洛谷·csp
田梓燊10 小时前
力扣:23.合并 K 个升序链表
算法·leetcode·链表
re林檎10 小时前
算法札记——4.27
算法
数据牧羊人的成长笔记11 小时前
逻辑回归与Softmax回归
算法·回归·逻辑回归