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

乘积最大子数组-leetcode

题目描述

给你一个整数数组 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 * 104
  • -10 <= nums[i] <= 10
  • nums 的任何子数组的乘积都 保证 是一个 32-位 整数

解法一

思路:

在乘法中,一个非常小的负数(比如 -100),一旦乘以一个负数(比如 -2),就会瞬间反转变成非常大的正数(200)。

maxF[i]:表示以第 i 个元素结尾的连续子数组的最大乘积

minF[i]:表示以第 i 个元素结尾的连续子数组的最小乘积

状态转移方程:

maxF[i] = Math.max(maxF[i - 1] * nums[i], Math.max(nums[i], minF[i - 1] * nums[i]));
minF[i] = Math.min(minF[i - 1] * nums[i], Math.min(nums[i], maxF[i - 1] * nums[i]));

这实际上是在比较 三个候选值,从中选出最大值给 maxF[i],选出最小值给 minF[i]

这三个候选值分别是:

  1. **nums[i] **
    • 如果前面的乘积是 0,或者前面的乘积是负数而当前元素是正数,那么和前面连起来反而会让乘积变小。这时候不如抛弃前面的累积,自己单独作为一个子数组的开头
  2. maxF[i - 1] * nums[i] (延续前面的最大值)
    • 如果当前 nums[i]正数,它当然希望乘以之前累积的最大正数(maxF[i-1]),这样能变得更大。
  3. minF[i - 1] * nums[i] (延续前面的最小值,期待负负得正)
    • 如果当前 nums[i]负数,它希望乘以之前累积的最小负数(minF[i-1]),通过负负得正,变成一个极大的正数。

所以,对于 maxF[i] 无论 nums[i] 是正还是负,当前位置的最大乘积一定产生于上述三种情况之中,所以直接用 Math.max 取这三者的最大值。

对于 minF[i] 同理,为了给未来的元素提供“负负得正”的弹药,我们需要一丝不苟地记录下当前能达到的最小乘积,所以用 Math.min 取这三者的最小值。

代码:

class Solution {public int maxProduct(int[] nums) {int length = nums.length;long[] maxF = new long[length];long[] minF = new long[length];for (int i = 0; i < length; i++) {maxF[i] = nums[i];minF[i] = nums[i];}for (int i = 1; i < length; ++i) {maxF[i] = Math.max(maxF[i - 1] * nums[i], Math.max(nums[i], minF[i - 1] * nums[i]));minF[i] = Math.min(minF[i - 1] * nums[i], Math.min(nums[i], maxF[i - 1] * nums[i]));if (minF[i] < (-1 << 31)) {minF[i] = nums[i];}}int ans = (int) maxF[0];for (int i = 1; i < length; ++i) {ans = Math.max(ans, (int) maxF[i]);}return ans;}
}
http://www.jsqmd.com/news/655413/

相关文章:

  • SAP ABAP开发实战:5分钟搞定调用外部REST API(含Basic Auth认证完整代码)
  • 5分钟掌握ComfyUI-Crystools:让你的AI工作流从此透明高效
  • 别再乱买USB HUB了!从芯片到协议,教你选对不踩坑(附避坑清单)
  • chrome gemini内置skills-从浏览器到ai原生智能体里程碑的转变
  • 告别玄学调试:用Vivado给Xilinx 7系列PCIe XDMA工程做一次完整的‘体检’(约束、时序、IP配置)
  • 从DWS到DTBO:揭秘MTK平台设备树构建的完整工具链
  • Anthropic为Claude引入实名认证:合规清场背后,AI行业竞争逻辑生变?
  • Open WebUI深度解析:构建企业级AI应用平台的实战指南
  • 从理论到实践:NURBS蒙皮曲面生成算法的核心步骤与实现解析
  • 2026届学术党必备的AI辅助写作助手实际效果
  • 中兴光猫配置文件加解密终极指南:3个步骤完全掌控你的网络设备
  • 从复平面到5G前传:一文读懂ZC序列为何是LTE/5G物理层的“万能钥匙”
  • 从数字记忆到永久存档:GetQzonehistory帮你完整备份QQ空间历史记录
  • 无需GPU也能玩转大模型?Llama Factory轻量级微调方案实测
  • Nginx 日志切割完全指南:从原理到生产实战
  • 从光线追迹到成像建模:单个折射球面的核心公式与符号体系解析
  • 如何用abap2xlsx在SAP中高效生成Excel文件:开发者实战指南
  • 终极防撤回指南:5分钟掌握微信QQ消息永久保存技巧
  • Zotero SciPDF插件深度解析:如何构建智能文献下载工作流
  • 苹果设备Windows驱动困境:3分钟解决iPhone USB网络共享难题
  • 2025最权威的十大降重复率工具推荐榜单
  • 若依WMS仓库管理系统:10分钟掌握现代化仓储管理的终极解决方案
  • 别再让虚线糊一脸!机械制图剖视图保姆级入门指南(附剖面符号速查表)
  • 【实战解析】BiLSTM+CRF:从模型原理到命名实体识别实战
  • 让Mem Reduct说中文:从安装到精通的全方位指南
  • Ultimaker Cura:如何用开源切片软件将你的创意转化为完美3D打印作品
  • 两道中等 DP 题拆解:打家劫舍 完全平方数
  • SAP与Concur通信中断?别慌!手把手教你用STRUST搞定SSL证书过期(附Concur证书下载)
  • DSView开源仪器软件:5步快速上手的完整指南
  • Rust编程基础课 第2课时:Rust基础语法(变量、数据类型、运算符)