152. 乘积最大子数组
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. 乘积最大子数组相关推荐
- 152 乘积最大子数组(动态规划)
1. 问题描述: 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积. 示例 1: 输入: [2,3,-2,4] 输出: 6 解 ...
- LeetCode 热题 HOT 100 第四十九天 152. 乘积最大子数组 中等题 用python3求解
题目地址 给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积. 测试用例的答案是一个32-位整数. 子数组 是数组的连续子序 ...
- leetcode 152. Maximum Product Subarray | 152. 乘积最大子数组(Java)
题目 https://leetcode.com/problems/maximum-product-subarray/ 题解 class Solution {public int maxProduct( ...
- 【LeetCode笔记】152. 乘积最大子数组(Java、动态规划)
文章目录 题目描述 思路 & 代码 更新版 题目描述 考虑正数.负数和0的情况 思路 & 代码 既然是使用的动态规划,那么有以下几点: 维护什么:维护iMax和iMin,分别代表包含当 ...
- 动态规划——乘积最大子数组(Leetcode 152)
题目选自Leetcode 152. 乘积最大子数组 题目描述: 解题思路: 解题代码: class Solution { public:int maxProduct(vector<int> ...
- 最大连续子数组和 动态规划_每日LeetCode,乘积最大子数组
152. 乘积最大子数组leetcode-cn.com 给你一个整数数组nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积. 示例 1: 输入: ...
- CodeTop097 乘积最大子数组
乘积最大子数组 给你一个整数数组nums,请你找出数组中乘积最大的非空连续子数组 (该子数组中至少包含一个数字),并返回该子数组所对应的乘积 测试用例的答案是一个32位整数 子数组是数组的连续子序列. ...
- [Leedcode][JAVA][第152题][乘积最大子数组][动态规划]
[问题描述][中等] 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积.示例 1:输入: [2,3,-2,4] 输出: 6 解 ...
- 算法-----------乘积最大子数组(Java版本)
题目: 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积.示例 1:输入: [2,3,-2,4] 输出: 6 解释: 子数组 ...
最新文章
- mysql如何实现读提交锁_MySQL学习笔记(二)—MySQL事务及锁详解
- android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )及屏幕适配注意事
- 配置 docker0 网桥
- Eclipse 答疑:代码版权?如何更改 Eclipse 中注释块的 @author 版权信息?
- 【服务端渲染】NuxtJs 综合案例
- 微服务部署:蓝绿部署、滚动部署、灰度发布
- Jetty与Tomcat的区别 转
- ios 自动打包命令_通过命令行xcodebuild编译打包iOS应用
- c# ComboBox禁用鼠标滚轮
- 关于域名注册、投资问题的相关解释
- 3分钟tips:Python中的range与xrange
- Push failed: Failed with error: Authentication failed for
- linux磁盘分配最佳实践,干货再次来袭!Linux小白最佳实践:《超容易的Linux系统管理入门书》(连载八)用命令实现批量添加用户...
- 彻底删除aws亚马逊服务器使之不再计费
- futuretask java 并发请求_【Java并发】Runnable、Callable、Future、FutureTask
- Java和Javax
- ORACLE-023:令人烦恼的 ora-01722 无效数字
- maven 打包指定依赖包_maven打包为jar-with-dependencies无依赖jar包方法
- k8s集群coredns无法解析外部域名
- git 分支管理推荐规范
热门文章
- 洛谷——P1342 请柬
- jQuery筛选器常用总结
- Asianux Server 3.0安装截图
- java中队列的类是什么意思_java中LinkedList集合类实现栈和队列要注意什么?
- 7-37 图形卡片排序游戏 (40 分)
- 7-2 停车场管理 (50分)
- html页面取js里面的值,如何在javascript中获取HTML元素的样式值?
- c语言不安全库_为什么和其他语言相比C语言是快速的语言?
- spwm逆变器双极性matlab教程,三相逆变器双极性SPWM调制技术的仿真(论文资料).doc...
- java 自定义文件后缀名_Java 的源代码文件的扩展名是( )。_学小易找答案