Evan Wang
Evan WangFrontEnd Developer
  • Evan Wang
    Evan WangFrontEnd Developer
  • 前端相关
  • 算法题
  • 日常笔记
  • Chat With AI

两数之和
两数相加
无重复字符的最长子串
最长回文子串
盛水最多的容器
三数之和
电话号码的字母组合
有效括号
合并两个有序链表
括号生成
下一个排列
搜索旋转排序数组
在排序数组中查找元素的第一个和最后一个位置
删除链表的倒数第n个节点
组合总和
全排列
旋转图像
字母异位词分组
最大子数组合
跳跃游戏
反转链表
反转链表2
合并区间
最小路径和
编辑距离
颜色分类
爬楼梯
组合
子集
不同的二叉搜索树
验证二叉搜索树
对称二叉树
二叉树的层序遍历
二叉树的最大深度
从前序与中序遍历序列构造二叉树
只出现一次的数字
二叉树展开为链表
最长连续序列
单词拆分
环形链表
环形链表2
排序链表
相交链表
乘积最大子数组
最小栈
多数元素
打家劫舍
数组中重复的数据
二叉树的中序遍历
卖股票的最佳时机
数组中的第K个最大元素

  1. Articles
  1. More
  2. 43-乘积最大子数组.mdx
目录
题目思路
877 字
约 3 分钟
更新于 2026/08/20

乘积最大子数组

题目

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
测试用例的答案是一个 32-位 整数。

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

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

思路

和第 19 题类似。

考虑到是乘积,存在 负负得正的情况,所以也需要存储当前乘积最小值 min 以便下一次使用。 假设上一次循环的乘积最小值是 min,最大值是 max 遍历数组,每次求出当前元素和 min 和 max 的乘积, 在 nums[i], nums[i] * min, nums[i] * max 三个数中求出新的 min 和 max 结束本次循环之前用 max res, 更新一下结果。

var maxProduct = function (nums) {
    let res = nums[0];
    let min = nums[0]; // 最小乘积
    let max = nums[0]; // 最大乘积
 
 
    let tempMin = nums[0]; // 当前变量 与上一次循环 min 的乘积
    let tempMax = nums[0]; // 当前变量与上一次循环 max 的乘积
 
    for(let i = 1; i < nums.length; i++) {
        tempMin = min * nums[i];
        tempMax = max * nums[i];
        min = Math.min(tempMin, tempMax, nums[i]); // 得到当前元素的最小乘积
        max = Math.max(tempMin, tempMax, nums[i]); // 得到当前元素的最大乘积
        res = Math.max(max, res); // 更新结果
    }
    return res;
};