Title

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

示例 1:

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

示例 2:

输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

Solve

动态规划

如果当前位置是一个负数的话,那么我们希望在它前面一个位置的某一段的积也是个负数,并且尽可能小,负负得正。

如果当前位置是一个正数的话,那么我们希望它前面一个位置的某一段的积也是个正数,并且希望它尽可能大。

这样,我们可以维护一个fmax(i)和fmin(i),分别表示以第i个元素结尾的最大(小)乘积的子数组的乘积。
fmax(i)=maxi=1n{fmax(i−1)∗ai,fmin(i−1)∗ai,ai}f_{max}(i)=max^{n}_{i=1}\{f_{max}(i-1)*a_i,f_{min}(i-1)*a_i,a_i\} fmax​(i)=maxi=1n​{fmax​(i−1)∗ai​,fmin​(i−1)∗ai​,ai​}fmin(i)=mini=1n{fmax(i−1)∗ai,fmin(i−1)∗ai,ai}f_{min}(i)=min^{n}_{i=1}\{f_{max}(i-1)*a_i,f_{min}(i-1)*a_i,a_i\} fmin​(i)=mini=1n​{fmax​(i−1)∗ai​,fmin​(i−1)∗ai​,ai​}

它代表第i个元素结尾的乘积最大子数组的乘积fmax(i),可以考虑吧ai加入第i-1个元素结尾的乘积最大或最小的子数组的乘积中,二者加上ai,三者取大。

第i个元素结尾的乘积最小子数组的乘积fmin(i)同理。

由于第i个状态只和第i-1个状态有关,根据【滚动数组】思想,可以只用fmax(i)和fmin(i)两个变量来维护i-1时刻的状态。

Code

class Solution:def maxProduct(self, nums: List[int]) -> int:maxF, minF, ans = nums[0], nums[0], nums[0]for i in range(1, len(nums)):mx, mn = maxF, minFmaxF = max(mx * nums[i], max(mn * nums[i], nums[i]))minF = min(mn * nums[i], min(mx * nums[i], nums[i]))ans = max(ans, maxF)return ans

152. 乘积最大子数组相关推荐

  1. 152 乘积最大子数组(动态规划)

    1. 问题描述: 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积. 示例 1: 输入: [2,3,-2,4] 输出: 6 解 ...

  2. LeetCode 热题 HOT 100 第四十九天 152. 乘积最大子数组 中等题 用python3求解

    题目地址 给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积. 测试用例的答案是一个32-位整数. 子数组 是数组的连续子序 ...

  3. leetcode 152. Maximum Product Subarray | 152. 乘积最大子数组(Java)

    题目 https://leetcode.com/problems/maximum-product-subarray/ 题解 class Solution {public int maxProduct( ...

  4. 【LeetCode笔记】152. 乘积最大子数组(Java、动态规划)

    文章目录 题目描述 思路 & 代码 更新版 题目描述 考虑正数.负数和0的情况 思路 & 代码 既然是使用的动态规划,那么有以下几点: 维护什么:维护iMax和iMin,分别代表包含当 ...

  5. 动态规划——乘积最大子数组(Leetcode 152)

    题目选自Leetcode 152. 乘积最大子数组 题目描述: 解题思路: 解题代码: class Solution { public:int maxProduct(vector<int> ...

  6. 最大连续子数组和 动态规划_每日LeetCode,乘积最大子数组

    152. 乘积最大子数组​leetcode-cn.com 给你一个整数数组nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积. 示例 1: 输入: ...

  7. CodeTop097 乘积最大子数组

    乘积最大子数组 给你一个整数数组nums,请你找出数组中乘积最大的非空连续子数组 (该子数组中至少包含一个数字),并返回该子数组所对应的乘积 测试用例的答案是一个32位整数 子数组是数组的连续子序列. ...

  8. [Leedcode][JAVA][第152题][乘积最大子数组][动态规划]

    [问题描述][中等] 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积.示例 1:输入: [2,3,-2,4] 输出: 6 解 ...

  9. 算法-----------乘积最大子数组(Java版本)

    题目: 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积.示例 1:输入: [2,3,-2,4] 输出: 6 解释: 子数组 ...

最新文章

  1. mysql如何实现读提交锁_MySQL学习笔记(二)—MySQL事务及锁详解
  2. android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )及屏幕适配注意事
  3. 配置 docker0 网桥
  4. Eclipse 答疑:代码版权?如何更改 Eclipse 中注释块的 @author 版权信息?
  5. 【服务端渲染】NuxtJs 综合案例
  6. 微服务部署:蓝绿部署、滚动部署、灰度发布
  7. Jetty与Tomcat的区别 转
  8. ios 自动打包命令_通过命令行xcodebuild编译打包iOS应用
  9. c# ComboBox禁用鼠标滚轮
  10. 关于域名注册、投资问题的相关解释
  11. 3分钟tips:Python中的range与xrange
  12. Push failed: Failed with error: Authentication failed for
  13. linux磁盘分配最佳实践,干货再次来袭!Linux小白最佳实践:《超容易的Linux系统管理入门书》(连载八)用命令实现批量添加用户...
  14. 彻底删除aws亚马逊服务器使之不再计费
  15. futuretask java 并发请求_【Java并发】Runnable、Callable、Future、FutureTask
  16. Java和Javax
  17. ORACLE-023:令人烦恼的 ora-01722 无效数字
  18. maven 打包指定依赖包_maven打包为jar-with-dependencies无依赖jar包方法
  19. k8s集群coredns无法解析外部域名
  20. git 分支管理推荐规范

热门文章

  1. 洛谷——P1342 请柬
  2. jQuery筛选器常用总结
  3. Asianux Server 3.0安装截图
  4. java中队列的类是什么意思_java中LinkedList集合类实现栈和队列要注意什么?
  5. 7-37 图形卡片排序游戏 (40 分)
  6. 7-2 停车场管理 (50分)
  7. html页面取js里面的值,如何在javascript中获取HTML元素的样式值?
  8. c语言不安全库_为什么和其他语言相比C语言是快速的语言?
  9. spwm逆变器双极性matlab教程,三相逆变器双极性SPWM调制技术的仿真(论文资料).doc...
  10. java 自定义文件后缀名_Java 的源代码文件的扩展名是( )。_学小易找答案