此专栏文章是对力扣上算法题目各种方法总结和归纳, 整理出最重要的思路和知识重点并以思维导图形式呈现, 当然也会加上我对导图的详解.

目的是为了更方便快捷的记忆和回忆算法重点(不用每次都重复看题解), 毕竟算法不是做了一遍就能完全记住的. 所以本文适合已经知道解题思路和方法, 想进一步加强理解和记忆的朋友, 并不适合第一次接触此题的朋友(可以根据题号先去力扣看看官方题解, 然后再看本文内容).

关于本专栏所有题目的目录链接, 刷算法题目的顺序/注意点/技巧, 以及思维导图源文件问题请点击此链接.

想进大厂, 刷算法是必不可少的, 欢迎和博主一起打卡刷力扣算法, 博主同步更新了算法视频讲解 和 其他文章/导图讲解, 更易于理解, 欢迎来看!

文章目录

  • 0.导图整理
  • 1.与 最大子序和 的不同
  • 2.优化空间
  • 源码
    • Python:
    • java:

题目链接:https://leetcode-cn.com/problems/maximum-product-subarray/solution/si-wei-dao-tu-zheng-li-zui-da-zi-xu-ji-h-r8du/

0.导图整理

1.与 最大子序和 的不同

本题在思想上和 最大子序和 是非常相似的, 甚至连定义dp数组及下标的含义都是相同的: 用fmax(i)来表示以第 i 个元素结尾的乘积最大子数组的乘积, ai表示输入参数 nums.

但是如果直接根据经验写出这样的状态转移方程: fmax(i)=max{f(i−1)+ai,ai}是错误的, 用比较专业的语言解释就是: 这里的定义并不满足「最优子结构」, 当前位置的最优解未必是由前一个位置的最优解转移得到的. 用白话来解释就是: 两个负数相乘有可能会得到更大的结果, 当前的最大值并不一定是通过上个状态的最大值决定的, 也可能是上个状态的最小值决定的. 这都是因为加法和乘法的不同性质决定的.

通过这样的分析就决定了我们还必须同时维护上个状态的最小值, 然后就可以写出如下的状态转移方程了:

它代表第i个元素结尾的乘积最大子数组的乘积fmax(i), 可以考虑把ai加入第 i−1 个元素结尾的乘积最大或最小的子数组的乘积中, 二者加上ai, 三者取大, 就是第i个元素结尾的乘积最大子数组的乘积. 第i个元素结尾的乘积最小子数组的乘积fmin(i)同理.

这是两者思想上的不同, 在实现代码上, 也有着一点差别, 在没有进行空间优化之前, 我们是需要维护两个dp数组的, 而且这两个数组是完全独立的, 这就说明我们不能通过数组的引用这种浅拷贝的方式来操作数组, 必须将数组进行真实的复制(深拷贝)之后再进行相关的操作, 这就是如下代码的含义:

System.araycopy(nums, 0, maxF, 0, length);//nums从0开始的位置复制到maxF从0开始的位置,长度length
System.araycopy(nums, 0, minF, 0, length);//对数组进行深拷贝,不能简单的使用数组的引用(浅拷贝)

2.优化空间

当然本题是可以像 最大子序和 一样进行空间优化的, 上面讲述的深拷贝的思想, 是为了让大家有这种意识, 在不能进行空间优化的时候该如何进行处理.

本题的优化也是挺简单的, 只需要用两个变量来维护i−1时刻的两种状态即可.

这里有个Python和java语言的注意点: java中的max/min函数只能包含两个参数, 当含有有个变量时, 要先进行两两比较, 再将比较之后的结果和其他变量再比较, 而Python中的可以包含任意个参数, 直接一起比较即可.

源码

Python:

# 优化空间
class Solution:def maxProduct(self, nums: List[int]) -> int:maxF, minF, ans = nums[0], nums[0], nums[0]length = len(nums)for i in range(1, length):mx, mn = maxF, minF # 只用两个变量来维护i−1时刻的状态,优化空间maxF = max(mx * nums[i], nums[i], mn * nums[i])minF = min(mn * nums[i], nums[i], mx * nums[i])ans = max(maxF, ans)return ans

java:

// 未优化空间
class Solution {public int maxProduct(int[] nums) {int length = nums.length;int[] maxF = new int[length];int[] minF = new int[length];//以第i个元素结尾的乘积最小子数组的乘积System.araycopy(nums, 0, maxF, 0, length);//nums从0开始的位置复制到maxF从0开始的位置,长度lengthSystem.araycopy(nums, 0, minF, 0, length);//对数组进行深拷贝,不能简单的使用数组的引用(浅拷贝)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]));}int ans = maxF[0];for (int i = 1; i < length; ++i) {ans = Math.max(ans, maxF[i]);}return ans;}
}// 优化空间
class Solution {public int maxProduct(int[] nums) {int maxF = nums[0], minF = nums[0], ans = nums[0];int length = nums.length;for (int i = 1; i < length; ++i) {int mx = maxF, mn = minF;//只用两个变量来维护i−1时刻的状态,优化空间maxF = Math.max(mx * nums[i], Math.max(nums[i], mn * nums[i]));minF = Math.min(mn * nums[i], Math.min(nums[i], mx * nums[i]));ans = Math.max(maxF, ans);}return ans;}
}

我的更多精彩文章链接, 欢迎查看

各种电脑/软件/生活/音乐/动漫/电影技巧汇总(你肯定能够找到你需要的使用技巧)

力扣算法刷题 根据思维导图整理笔记快速记忆算法重点内容(欢迎和博主一起打卡刷题哦)

计算机专业知识 思维导图整理

最值得收藏的 Python 全部知识点思维导图整理, 附带常用代码/方法/库/数据结构/常见错误/经典思想(持续更新中)

最值得收藏的 C++ 全部知识点思维导图整理(清华大学郑莉版), 东南大学软件工程初试906科目

最值得收藏的 计算机网络 全部知识点思维导图整理(王道考研), 附带经典5层结构中英对照和框架简介

最值得收藏的 算法分析与设计 全部知识点思维导图整理(北大慕课课程)

最值得收藏的 数据结构 全部知识点思维导图整理(王道考研), 附带经典题型整理

最值得收藏的 人工智能导论 全部知识点思维导图整理(王万良慕课课程)

最值得收藏的 数值分析 全部知识点思维导图整理(东北大学慕课课程)

最值得收藏的 数字图像处理 全部知识点思维导图整理(武汉大学慕课课程)

红黑树 一张导图解决红黑树全部插入和删除问题 包含详细操作原理 情况对比

各种常见排序算法的时间/空间复杂度 是否稳定 算法选取的情况 改进 思维导图整理

人工智能课件 算法分析课件 Python课件 数值分析课件 机器学习课件 图像处理课件

考研相关科目 知识点 思维导图整理

考研经验–东南大学软件学院软件工程(这些基础课和专业课的各种坑和复习技巧你应该知道)

东南大学 软件工程 906 数据结构 C++ 历年真题 思维导图整理

东南大学 软件工程 复试3门科目历年真题 思维导图整理

最值得收藏的 考研高等数学 全部知识点思维导图整理(张宇, 汤家凤), 附做题技巧/易错点/知识点整理

最值得收藏的 考研线性代数 全部知识点思维导图整理(张宇, 汤家凤), 附带惯用思维/做题技巧/易错点整理

高等数学 中值定理 一张思维导图解决中值定理所有题型

考研思修 知识点 做题技巧 同类比较 重要会议 1800易错题 思维导图整理

考研近代史 知识点 做题技巧 同类比较 重要会议 1800易错题 思维导图整理

考研马原 知识点 做题技巧 同类比较 重要会议 1800易错题 思维导图整理

考研数学课程笔记 考研英语课程笔记 考研英语单词词根词缀记忆 考研政治课程笔记

Python相关技术 知识点 思维导图整理

Numpy常见用法全部OneNote笔记 全部笔记思维导图整理

Pandas常见用法全部OneNote笔记 全部笔记思维导图整理

Matplotlib常见用法全部OneNote笔记 全部笔记思维导图整理

PyTorch常见用法全部OneNote笔记 全部笔记思维导图整理

Scikit-Learn常见用法全部OneNote笔记 全部笔记思维导图整理

Java相关技术/ssm框架全部笔记

Spring springmvc Mybatis jsp

科技相关 小米手机

小米 红米 历代手机型号大全 发布时间 发布价格

常见手机品牌的各种系列划分及其特点

历代CPU和GPU的性能情况和常见后缀的含义 思维导图整理

❤️思维导图整理大厂面试高频数组14: 最大子序积 和 最大子序和 的不同之处, 力扣152❤️相关推荐

  1. 思维导图整理大厂面试高频数组23: 股票问题大总结, 彻底搞懂股票问题

    此专栏文章是对力扣上算法题目各种方法的总结和归纳, 整理出最重要的思路和知识重点并以思维导图形式呈现, 当然也会加上我对导图的详解. 目的是为了更方便快捷的记忆和回忆算法重点(不用每次都重复看题解), ...

  2. ❤️思维导图整理大厂面试高频数组: 两万字详解各种数组求和(建议收藏)❤️

    此专栏文章是对力扣上算法题目各种方法的总结和归纳, 整理出最重要的思路和知识重点并以思维导图形式呈现, 当然也会加上我对导图的详解. 目的是为了更方便快捷的记忆和回忆算法重点(不用每次都重复看题解), ...

  3. ❤️思维导图整理大厂面试高频数组19: 股票问题III的dp数组构建/初始化和空间优化难点, 力扣123❤️

    此专栏文章是对力扣上算法题目各种方法的总结和归纳, 整理出最重要的思路和知识重点并以思维导图形式呈现, 当然也会加上我对导图的详解. 目的是为了更方便快捷的记忆和回忆算法重点(不用每次都重复看题解), ...

  4. ❤️思维导图整理大厂面试高频数组20: 股票问题IV的dp数组构建和几个重要注意点❤️

    此专栏文章是对力扣上算法题目各种方法的总结和归纳, 整理出最重要的思路和知识重点并以思维导图形式呈现, 当然也会加上我对导图的详解. 目的是为了更方便快捷的记忆和回忆算法重点(不用每次都重复看题解), ...

  5. 思维导图整理大厂面试高频数组补充1: 最接近的三数之和 和 三数之和 的两个不同之处, 力扣16

    此专栏文章是对力扣上算法题目各种方法的总结和归纳, 整理出最重要的思路和知识重点并以思维导图形式呈现, 当然也会加上我对导图的详解. 目的是为了更方便快捷的记忆和回忆算法重点(不用每次都重复看题解), ...

  6. 最值得收藏的 C++ 清华大学郑莉版全部知识点思维导图整理, 东南大学软件工程初试906科目

    本文的思维导图根据清华大学郑莉出版的C++书籍整理而来并标记出重点内容,适用于想考东南大学软件工程906的同学 思维导图源文件已经发布在我的资源当中, 点击获取全部导图和配套OneNote笔记, 有需 ...

  7. Java基础编程及思维导图整理

    我把Java基础编程及思维导图整理的超级详细,小白都能看懂 Java基础编程及其思维导图 目录: Java学习导图 一.Java基本语法 1.关键字与标识符 2.变量分类 3.运算符 4.流程控制 二 ...

  8. 最值得收藏的 数字图像处理 全部知识点思维导图整理(武汉大学慕课课程)(持续更新中)

    本文的思维导图根据慕课上的武汉大学数字图像处理国家精品课程整理而来并标记出重点内容 思维导图就整理了这么多,之后应该也不会更新此内容了, 有需要的可以去 我的主页 了解更多学科的精品思维导图整理 本文 ...

  9. 最值得收藏的 数据结构 全部知识点思维导图整理(王道考研), 附带经典题型整理

    本文的思维导图根据王道的数据结构书本整理而来并标记出重点内容,包括了知识点和部分课后习题 思维导图源文件已经发布在我的资源当中, 点击获取全部导图和配套OneNote笔记, 有需要的可以去 我的主页 ...

最新文章

  1. Android深度探索(卷1)HAL与驱动开发读后感---第四章
  2. SSI——服务器端嵌入
  3. python简单爬虫课题_VS2019python爬虫入门
  4. Solr--企业级搜索应用服务器
  5. 5个球放入3个箱子_国内5个经典的美食小吃,吃过3个以上算厉害,你吃过几个?...
  6. request.path 值危险
  7. Python 科学计算库 Numpy 准备放弃 Python 2 了
  8. c语言标识符附录,附录AC语言运算符表.PDF
  9. 基于HT for Web的3D树的实现
  10. Swift 数据类型(三)
  11. BFC详解【CSS面试题】
  12. 【计算机网络】一篇文章带你分清波特率和比特率~
  13. Phoenix创建Hbase二级索引_尚硅谷大数据培训
  14. Python操作Redis之mset和mget
  15. 计算机win7关机重启,电脑win7关机后自动重启如何解决_win7一关机就立马自动重启修复方法-win7之家...
  16. (转)练好太极拳 基本功是必经之路
  17. 在sae上面运行微信第三方平台微擎,带视频录像
  18. IT职场人生:学外语
  19. java 耦合解耦_程序的耦合和解耦
  20. GCC详解-gcc之-Wl选项

热门文章

  1. OhMyZsh是一款开源工具,可以用于管理Zsh(Linux命令解释器的一种)的配置
  2. Ajax图书管理系统-完整代码与细节部分详细讲解
  3. Js判断选择日期不能小于当前日期
  4. 华为云早报 思科23.5亿美元收购互联网安全公司Duo Security
  5. 二开云豹直播带货6月新版本
  6. Could not locate executable null\bin\winutils.exe in the Hadoop binaries全网最强windows10安装hadoop教程
  7. 小白如何使用DSW玩转天池NLP算法大赛
  8. 计算时间差C语言实现
  9. 3.java-判断是否为标准体重
  10. 人生不能同时追赶两只兔子