当前位置: 首页 > article >正文

【Leetcode 热题 100】152. 乘积最大子数组

问题背景

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

数据约束

  • 1 ≤ n u m s . l e n g t h ≤ 2 × 1 0 4 1 \le nums.length \le 2 \times 10 ^ 4 1nums.length2×104
  • − 10 ≤ n u m s [ i ] ≤ 10 -10 \le nums[i] \le 10 10nums[i]10
  • n u m s nums nums 的任何子数组的乘积都 保证 是一个 32 32 32 整数

解题过程

这题很好地适用动态规划的思想,但是不需要回溯来实现。
任何时候结果都只可能在当前乘积的最大值、最小值(负数)和当前元素本身这三者中产生。因此,只需要遍历数组并在这个过程中维护最大最小值,最后从中求得结果即可。
进一步考虑到当前的最大最小值其实只与上个状态有关,记忆化数组可以减少一个维度退化为变量。

具体实现

数组记录

class Solution {
    public int maxProduct(int[] nums) {
        int n = nums.length;
        int[] max = new int[n];
        int[] min = new int[n];
        max[0] = min[0] = nums[0];
        for (int i = 1; i < n; i++) {
            int cur = nums[i];
            max[i] = Math.max(Math.max(max[i - 1] * cur, min[i - 1] * cur), cur);
            min[i] = Math.min(Math.min(max[i - 1] * cur, min[i - 1] * cur), cur);
        }
        return Arrays.stream(max).max().getAsInt();
    }
}

空间优化

class Solution {
    public int maxProduct(int[] nums) {
        int res = Integer.MIN_VALUE;
        int max = 1;
        int min = 1;
        for (int num : nums) {
            // 注意这里需要记录当前最大值,接下来马上要更新,会影响到最小值的计算
            int curMax = max;
            max = Math.max(Math.max(curMax * num, min * num), num);
            min = Math.min(Math.min(curMax * num, min * num), num);
            res = Math.max(res, max);
        }
        return res;
    }
}

http://www.kler.cn/a/523380.html

相关文章:

  • C# dataGridView1获取选中行的名字
  • Unbutu虚拟机+eclipse+CDT编译调试环境搭建
  • Vue.js组件开发-实现下载动态进度条
  • 进程通讯——类型和发展
  • 【PyQt5】数据库连接失败: Driver not loaded Driver not loaded
  • 基于vue和elementui的简易课表
  • 2025春晚临时直播源接口
  • Jellyfin的快速全文搜索代理JellySearch
  • iperf 测 TCP 和 UDP 网络吞吐量
  • 2025年数学建模美赛 A题分析(2)楼梯使用频率数学模型
  • t113 procd-init文件系统增加自己的程序文件
  • 7-Zip Mark-of-the-Web绕过漏洞复现(CVE-2025-0411)
  • 前端——js高级25.1.27
  • 20250128 大语言模型(Large Language Model, LLM)已成为自然语言处理(NLP)领域的重要突破
  • 脚本/编译安装nginx1.11.10
  • ArcGIS10.2 许可License点击始终启动无响应的解决办法及正常启动的前提
  • 使用 PyTorch 实现线性回归:从零开始的完整指南
  • Ubuntu 18.04安装Emacs 26.2问题解决
  • 大一计算机的自学总结:位运算的应用及位图
  • 在做题中学习(82):最小覆盖子串
  • Vue 响应式渲染 - 待办事项简单实现
  • 案例研究丨浪潮云洲通过DataEase推进多维度数据可视化建设
  • 图神经网络驱动的节点分类:从理论到实践
  • 神经网络和深度学习
  • DeepSeek-R1本地部署笔记
  • Zookeeper(31)Zookeeper的事务ID(zxid)是什么?