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

【力扣100题】48.乘积最大子数组

题目描述给你一个整数数组nums请你找出数组中乘积最大的非空连续子数组该子数组中至少包含一个数字并返回该子数组所对应的乘积。测试用例的答案是一个32 位整数。注意一个只包含一个元素的数组的乘积就是这个元素的值。示例输入nums [2,3,-2,4]→ 输出6子数组[2,3]有最大乘积 6输入nums [-2,0,-1]→ 输出0结果不能为 2因为[-2,-1]不是子数组解题思路总览方法思路时间复杂度空间复杂度动态规划同时维护最大乘积和最小乘积因为负数会使最小变最大O(n)O(1)分治递归处理每个区间考虑奇数个负数和偶数个负数的情况O(n log n)O(log n)暴力枚举枚举所有子数组计算乘积O(n^2)O(1)本题采用动态规划方法。完整代码classSolution{public:intmaxProduct(vectorintnums){intansINT_MIN,imax1,imin1;for(inti0;inums.size();i){if(nums[i]0){inttempimax;imaximin;imintemp;}imaxmax(imax*nums[i],nums[i]);iminmin(imin*nums[i],nums[i]);ansmax(ans,imax);}returnans;}};算法流程图输入: nums [2, 3, -2, 4] 初始化: ans INT_MIN -∞ imax 1 imin 1 i 0, nums[0] 2: 2 0? 否不需要交换 imax max(1*2, 2) max(2, 2) 2 imin min(1*2, 2) min(2, 2) 2 ans max(-∞, 2) 2 i 1, nums[1] 3: 3 0? 否不需要交换 imax max(2*3, 3) max(6, 3) 6 imin min(2*3, 3) min(6, 3) 3 ans max(2, 6) 6 i 2, nums[2] -2: -2 0? 是交换 imax 和 imin temp imax 6 imax imin 3 imin temp 6 imax max(3*(-2), -2) max(-6, -2) -2 imin min(6*(-2), -2) min(-12, -2) -12 ans max(6, -2) 6 i 3, nums[3] 4: 4 0? 否不需要交换 imax max(-2*4, 4) max(-8, 4) 4 imin min(-12*4, 4) min(-48, 4) -48 ans max(6, 4) 6 最终 ans 6 输出: 6逐行解析intansINT_MIN,imax1,imin1;含义ans记录全局最大乘积初始化为最小整数imax记录以当前位置结尾的连续子数组的最大乘积imin记录以当前位置结尾的连续子数组的最小乘积初始化为 1 是因为乘积的起始值为 1单位元for(inti0;inums.size();i)含义遍历数组依次计算以每个位置结尾的子数组的最大乘积。if(nums[i]0){inttempimax;imaximin;imintemp;}含义如果当前元素是负数会将最大乘积和最小乘积互换。因为负数乘以最大数会变成最小数乘以最小数会变成最大数。imaxmax(imax*nums[i],nums[i]);含义更新imax。取「之前累积的最大乘积乘以当前元素」和「重新从当前元素开始」中的较大值。iminmin(imin*nums[i],nums[i]);含义更新imin。取「之前累积的最小乘积乘以当前元素」和「重新从当前元素开始」中的较小值。ansmax(ans,imax);含义更新全局最大乘积。returnans;含义返回所有子数组中的最大乘积。核心思想为什么需要同时维护最大和最小乘积因为数组中可能存在负数。以[2, 3, -2, 4]为例当遍历到-2时之前累积的最大乘积是6如果继续乘以负数-26 × (-2) -12变成很小的数但如果我们之前累积的是最小乘积呢2 × 3 × (-2) -12再乘以-2就变成24了所以当遇到负数时最大和最小会互换角色。必须同时记录最大和最小才能应对各种情况。复杂度分析复杂度值说明时间复杂度O(n)只需遍历一次数组空间复杂度O(1)只使用了常数个变量面试追问 FAQ问题答案为什么初始化imax imin 11 是乘法的单位元方便统一处理「从当前位置重新开始」的情况为什么不比较imax * nums[i]和1 * nums[i]因为nums[i]本身就是imax 1时imax * nums[i]的一种情况遇到 0 会怎样0 会让乘积变成 0同时是子数组的分界线。max(0, imax*0) 0会重新从下一个位置开始计算和最大子数组和53题有什么区别最大子数组和问题可以用贪心但乘积问题因为负数的存在必须用动态规划同时维护最大和最小如何输出具体的子数组额外记录每个位置的imax是来自之前的累积还是重新开始最后回溯得到起止位置进阶如何求乘积最小子数组将ans max(ans, imax)改为ans min(ans, imin)即可相关题目题号题目难度核心思路152乘积最大子数组中等动态规划最大/最小乘积53最大子数组和中等动态规划/贪心918环形子数组的最大和中等动态规划 环形数组1567乘积为正的最长子数组长度中等动态规划记录正/负乘积长度总结要点内容核心思想同时维护最大乘积和最小乘积因为负数会使两者互换状态定义imax[i] 以第 i 个元素结尾的连续子数组的最大乘积状态定义imin[i] 以第 i 个元素结尾的连续子数组的最小乘积状态转移遇到负数时交换 imax 和 imin然后imax max(imax*nums[i], nums[i])初始化imax imin 1ans INT_MIN结果返回遍历过程中的最大 ans

相关文章:

【力扣100题】48.乘积最大子数组

题目描述 给你一个整数数组 nums,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。 测试用例的答案是一个 32 位整数。注意,一个只包含一个元素的数组的乘积就是这个…...

桌面级机械臂DIY全攻略:从运动学建模到PID控制实战

1. 项目概述:一个桌面级机械臂的诞生最近在逛GitHub的时候,发现了一个挺有意思的项目,叫“ClawPuter”。光看名字,你可能会有点摸不着头脑,Claw是爪子,Puter是计算机,合起来是“爪式计算机”&am…...

3分钟搞定游戏模组:BepInEx插件框架终极入门指南

3分钟搞定游戏模组:BepInEx插件框架终极入门指南 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx 想让你的游戏拥有无限可能?厌倦了游戏原有的玩法&#xff…...

3步零编程定制你的Windows系统:Windhawk终极指南

3步零编程定制你的Windows系统:Windhawk终极指南 【免费下载链接】windhawk The customization marketplace for Windows programs: https://windhawk.net/ 项目地址: https://gitcode.com/gh_mirrors/wi/windhawk 想要个性化Windows界面却不懂编程&#xff…...

城市规划师实战:如何用TransCad+四阶段法,为你的新区规划提供交通量支撑?

城市规划师实战:TransCad与四阶段法在新区交通规划中的深度应用 1. 从理论到实践:四阶段法的核心逻辑 在Z新城规划项目中,我们面临的核心挑战是如何科学预测未来15年的交通需求。四阶段法作为交通规划领域的经典方法论,其价值在于…...

NExT-GPT:端到端任意模态大模型架构解析与实战指南

1. 项目概述:当多模态大模型遇见“全感官”交互最近在和朋友聊起多模态大模型时,大家总绕不开一个话题:现有的模型,无论是GPT-4V还是Gemini,虽然能“看”能“说”,但总感觉少了点什么。它们更像是一个单向的…...

Ren`Py 引擎初探:从零搭建你的Python视觉小说项目

1. 为什么选择RenPy开发视觉小说? 第一次听说RenPy是在三年前,当时我正在寻找能用Python开发的游戏引擎。试过Unity、Unreal这些主流引擎后,发现它们要么需要学习C#,要么对2D支持不够友好。直到偶然在论坛看到有人用RenPy做文字冒…...

手把手教你用Reflector+Reflexil插件绕过Help Viewer 2.0的签名验证(附详细图文)

绕过Help Viewer 2.0签名验证的深度解决方案 当你在Visual Studio 2015/2017/2019中尝试通过Help Viewer下载文档时,可能会遇到一个令人沮丧的错误提示:"该.cab文件未经Microsoft正确签名"。这个问题源于Help Viewer 2.0对下载内容执行的严格签…...

ZeroAPI:基于Go与JS的极简文件系统API服务器设计与实践

1. 项目概述:一个极简API服务器的诞生最近在折腾一些个人项目和小工具时,我常常遇到一个场景:需要一个轻量级的、能快速响应的后端接口,用来处理一些简单的数据逻辑,比如表单提交、状态查询,或者作为前端页…...

希伯来文语音上线倒计时72小时!ElevenLabs生产环境紧急修复清单:DNS预热、SSL证书SNI兼容、以及3个必须禁用的默认voice preset

更多请点击: https://intelliparadigm.com 第一章:希伯来文语音上线倒计时72小时:全局技术态势与交付承诺 希伯来文语音合成(Hebrew TTS)系统已进入最终验证阶段,核心引擎完成全链路压力测试,平…...

UI-TARS桌面版终极指南:用自然语言控制电脑的免费AI助手

UI-TARS桌面版终极指南:用自然语言控制电脑的免费AI助手 【免费下载链接】UI-TARS-desktop The Open-Source Multimodal AI Agent Stack: Connecting Cutting-Edge AI Models and Agent Infra 项目地址: https://gitcode.com/GitHub_Trending/ui/UI-TARS-desktop …...

ITK-SNAP医学图像分割:精准医疗影像分析的利器

ITK-SNAP医学图像分割:精准医疗影像分析的利器 【免费下载链接】itksnap ITK-SNAP medical image segmentation tool 项目地址: https://gitcode.com/gh_mirrors/it/itksnap 面对复杂的医学影像数据,如何快速准确地进行三维解剖结构分割&#xff…...

5个核心技巧快速掌握p5.js Web Editor:从零到创作的艺术编程之旅

5个核心技巧快速掌握p5.js Web Editor:从零到创作的艺术编程之旅 【免费下载链接】p5.js-web-editor The p5.js Editor is a website for creating p5.js sketches, with a focus on making coding accessible and inclusive for artists, designers, educators, be…...

别再傻傻分不清了!全桥、半桥、推挽电源拓扑,到底哪个更适合你的项目?

全桥、半桥与推挽拓扑实战选型指南:从理论到工程落地的关键抉择 在电力电子设计领域,拓扑结构的选择往往决定着整个项目的成败。当我第一次面对500W工业电源设计需求时,曾天真地认为"功率越大拓扑越高级"——这个错误认知让我付出了…...

texgen.js扩展开发终极指南:如何自定义纹理生成器和滤镜

texgen.js扩展开发终极指南:如何自定义纹理生成器和滤镜 【免费下载链接】texgen.js JavaScript Texture Generator 项目地址: https://gitcode.com/gh_mirrors/te/texgen.js texgen.js 是一个功能强大的JavaScript纹理生成器库,它让开发者能够通…...

别再死磕官方文档了!R语言circlize包画圈图,这份新手避坑笔记帮你省下三天时间

R语言circlize包实战指南:从挫败感到高效绘图的进阶之路 第一次打开circlize包的官方文档时,那种扑面而来的复杂参数和抽象概念让人望而生畏。作为生物信息学分析中常用的环形可视化工具,circlize包在基因组数据展示、多维度数据关联分析等领…...

ROFL-Player:打破英雄联盟回放观看壁垒的革命性工具

ROFL-Player:打破英雄联盟回放观看壁垒的革命性工具 【免费下载链接】ROFL-Player (No longer supported) One stop shop utility for viewing League of Legends replays! 项目地址: https://gitcode.com/gh_mirrors/ro/ROFL-Player 你是否曾经因为游戏版本…...

从PAM到BanditPAM:k-Medoids聚类算法的演进、优化与实战选型指南

1. 为什么需要k-Medoids算法? k-Means算法大家应该都不陌生,它简单高效,是很多数据科学项目的入门首选。但我在实际项目中经常遇到这样的情况:当数据集中存在异常值或噪声点时,k-Means的表现就会大打折扣。这是因为k-M…...

烟草叶部病害-目标检测数据集(包括VOC格式、YOLO格式)

烟草叶部病害-目标检测数据集(包括VOC格式、YOLO格式) 数据集(文章最后关注公众号获取数据集): 链接: https://pan.baidu.com/s/1-4LCiMULEf7OT9JHzL38BQ?pwdytbu 提取码: ytbu 数据集信息介绍: 共有 156…...

Ubuntu 22.04 下配置 Arduino IDE 2.x:从安装到第三方库的完整避坑指南

1. 准备工作:下载Arduino IDE 2.x 在Ubuntu 22.04上配置Arduino开发环境,第一步自然是获取官方IDE。我推荐直接从Arduino官网下载最新版本,避免使用老旧软件包带来的兼容性问题。打开浏览器访问arduino.cc/en/software,你会看到两…...

BepInEx启动失败完整指南:从IL2CPP兼容性到游戏正常运行

BepInEx启动失败完整指南:从IL2CPP兼容性到游戏正常运行 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx作为Unity游戏插件框架,在IL2CPP编译模式下…...

QT新手避坑:一个QWidget只能有一个QLayout,别再重复setLayout了

QT布局管理核心机制:从QLayout父子关系到内存安全实践 在QT的GUI开发中,布局管理是最基础也最容易踩坑的领域之一。许多刚接触QT的开发者,往往会被看似简单的布局系统所迷惑,直到控制台不断输出"QLayout: Attempting to add …...

LeaderKey.app开发者指南:深入源码解析架构设计

LeaderKey.app开发者指南:深入源码解析架构设计 【免费下载链接】LeaderKey The *faster than your launcher* launcher 项目地址: https://gitcode.com/gh_mirrors/le/LeaderKey LeaderKey.app是一款轻量级启动器应用,以"比你的启动器更快&…...

AntiDupl.NET终极指南:快速清理重复图片的免费开源神器

AntiDupl.NET终极指南:快速清理重复图片的免费开源神器 【免费下载链接】AntiDupl A program to search similar and defect pictures on the disk 项目地址: https://gitcode.com/gh_mirrors/an/AntiDupl 你是否曾为电脑中堆积如山的重复图片而烦恼&#xf…...

让 SACF 自动捕获授权对象,把新授权检查安全带进生产系统

很多 ABAP 老系统里,最敏感的改造不是性能优化,也不是把一个古早 FORM 重构成类方法,而是在已经稳定运行多年的业务代码里补授权检查。原因很直接,少一次授权检查,审计和安全团队会觉得风险很大,多一次授权检查,生产用户可能第二天就打不开业务功能。SACF,也就是 Switc…...

ROFL-Player:基于C的多版本英雄联盟回放文件解析技术实现

ROFL-Player:基于C#的多版本英雄联盟回放文件解析技术实现 【免费下载链接】ROFL-Player (No longer supported) One stop shop utility for viewing League of Legends replays! 项目地址: https://gitcode.com/gh_mirrors/ro/ROFL-Player ROFL-Player是一款…...

Winhance中文版:Windows系统优化终极指南,3分钟让电脑焕然一新

Winhance中文版:Windows系统优化终极指南,3分钟让电脑焕然一新 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mir…...

用 IDENTITY 数据销毁对象处理个人数据销毁,SAP ILM 场景下的信息检索与合规闭环

做 SAP 系统里的个人数据治理,最怕的不是删除动作本身,而是删除之前没有把数据的来源、用途、保留规则、可检索性和审计链路讲清楚。一个系统里只要出现客户、联系人、消费者、会员、订阅人、业务伙伴、技术访问账号等身份相关对象,围绕这些对象产生的姓名、邮箱、手机号、登…...

TI毫米波雷达IWR/AWR1642 L3 RAM内存优化实战:从原理到配置

1. 项目概述:为何要动L3 RAM这块“蛋糕”?如果你正在基于TI的IWR1642或AWR1642毫米波雷达芯片进行开发,尤其是当你的应用代码量越来越大,或者数据处理任务越来越重时,你可能会遇到一个瓶颈:内存不够用了。不…...

简单三步让Windows焕然一新:Winhance中文版完整优化指南

简单三步让Windows焕然一新:Winhance中文版完整优化指南 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi/Winhance-…...