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

LeetCode 152. 乘积最大子数组 - 动态规划解法详解

文章目录

    • 问题描述
    • 解题思路
      • 动态规划状态定义
      • 状态转移方程
    • 完整代码实现
    • 复杂度分析
    • 示例解析
    • 关键点说明
    • 总结

问题描述

给定一个整数数组 nums,请找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组对应的乘积。

示例

输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6

解题思路

乘积最大子数组问题与和最大子数组问题的关键区别在于乘积的符号特性:负数乘以负数会得到正数。这意味着:

  1. 不能只维护最大值,还需要维护最小值(因为最小负值可能遇到负数变成最大值)
  2. 状态转移需要考虑三种情况:当前元素本身、当前元素×前序最大值、当前元素×前序最小值

动态规划状态定义

  • currentMax:以当前元素结尾的连续子数组的最大乘积
  • currentMin:以当前元素结尾的连续子数组的最小乘积
  • maxProduct:全局最大乘积(最终结果)

状态转移方程

对于每个元素 nums[i]

temp = currentMax  // 保存前一个位置的最大值
currentMax = max(nums[i], temp * nums[i], currentMin * nums[i])
currentMin = min(nums[i], temp * nums[i], currentMin * nums[i])
maxProduct = max(maxProduct, currentMax)

完整代码实现

class Solution {public int maxProduct(int[] nums) {
http://www.xdnf.cn/news/791299.html

相关文章:

  • 集成学习三种框架
  • C++中的指针参数传递与引用参数传递详解
  • 5985/wsman 是什么?
  • 一、基础环境配置
  • Linux中实现用户态DMA直通访问的零拷贝机制
  • 《Spring Bean 是怎么被创建出来的?容器启动流程全景分析》
  • 小体积涵盖日常办公等多功能的软件
  • MyBatis实战项目测试
  • 2025.6.3学习日记 Nginx 基本概念 配置 指令 文件
  • React-native之Flexbox
  • nginx 如何禁用tls1.0
  • CSS radial-gradient函数详解
  • JVM-内存结构
  • MAU算法流程理解
  • VueUse:组合式API实用函数全集
  • ADI硬件笔试面试题型解析上
  • DevEco Studio的使用
  • VUE组件库开发 八股
  • 时态--10--被动语态
  • Selenium 中 JavaScript 点击操作的原理及应用
  • Java:跨越时代的编程语言,持续引领技术革新
  • IPython 使用技巧整理
  • 强化学习鱼书(10)——更多深度强化学习的算法
  • Spring AI 项目实战(一):Spring AI 核心模块入门
  • 【Linux】Linux 进程基础
  • 华为港城 RAG 推理训练新突破:过程监督助力 5k 样本性能超越 90k 模型
  • 神经符号集成-三篇综述
  • COMSOL多边形骨料堆积混凝土水化热传热模拟
  • shell脚本总结13:head -c 和cut -c的区别
  • C++ 中的依赖注入(Dependency Injection)