当前位置: 首页 > 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.lqws.cn/news/105265.html

相关文章:

  • 代码随想录60期day56
  • Android Kotlin 算法详解:链表相关
  • SpringBoot核心注解详解及3.0与2.0版本深度对比
  • java复习 02
  • 2.3 关于async/await的原理介绍
  • IBM DB2分布式数据库架构
  • Baklib内容中台AI重构智能服务
  • 秋招准备-数据结构
  • Java-IO流之字节输入流详解
  • MFC Resource.h 文件详解与修改指南
  • 网络安全-等级保护(等保)3-0 等级保护测评要求现行技术标准
  • 强制卸载openssl-libs导致系统异常的修复方法
  • C++仿RabbitMQ实现消息队列
  • WINUI——Magewell视频捕捉开发手记
  • RabbitMQ在SpringBoot中的应用
  • Easyui悬停组件
  • 机器学习——放回抽样
  • Vue3中Axios的使用-附完整代码
  • 12、企业应收账款(AR)全流程解析:从发票开具到回款完成
  • BugKu Web渗透之game1
  • 倚光科技:Zernike自由曲面转菲涅尔,反射镜及透镜加工技术革新
  • 鸿蒙5.0项目开发——横竖屏切换开发
  • 解锁电商新势能:商城系统自动 SaaS 多开功能深度解析
  • Redis中的fork操作
  • browser-use Agent 日志链路分析
  • Nginx + Tomcat 负载均衡、动静分离群集
  • CMS32M65xx/67xx系列CoreMark跑分测试
  • dvwa6——Insecure CAPTCHA
  • 【机器学习及深度学习】机器学习模型的误差:偏差、方差及噪声
  • 机器学习:集成学习概念、分类、随机森林