152. Maximum Product Subarray(动态规划)
2024-09-17 10:42:47
Given an integer array nums
, find the contiguous subarray within an array (containing at least one number) which has the largest product.
Example 1:
Input: [2,3,-2,4]
Output:6
Explanation: [2,3] has the largest product 6.
Example 2:
Input: [-2,0,-1]
Output: 0
Explanation: The result cannot be 2, because [-2,-1] is not a subarray.
由于负数的存在,需要同时保存当前最大值和当前最小值,所以需要维护两个DP表,可以分别表示为dp_min和dp_max。所以即为dp_max里的最大值。
需要维护的当前最大值和当前最小值,都是在dp_min[i-1] * A[i],dp_max[i] * A[i],和A[i]这三者里面取一即可。有了这个只关乎最终状态,不关乎过程细节的结论,解题过程可以大大简化。
class Solution {
public:
int maxProduct(vector<int>& nums) {
int n = nums.size();
if(n==) return ;
vector<int>dp_max(n,nums[]);
vector<int>dp_min(n,nums[]); int res_val = nums[];
for(int i =;i<n;i++){
dp_max[i] = std::max( std::max(dp_max[i-]*nums[i],dp_min[i-]*nums[i]), nums[i]);
dp_min[i]= std::min( std::min(dp_min[i-]*nums[i],dp_max[i-]*nums[i]), nums[i]); }
for(int i =;i<n;i++)
res_val = std::max(dp_max[i],res_val);
return res_val; }
};
思考以上DP解法的空间开销过大的原因,是因为保存了整个DP表。其实整个过程中,获得dp[i]的值只需要dp[i-1]的值,所以是不需要保存整个DP表的。
这样一来,DP可以用滚动数组进行优化。简单的写法其实就是设一对prevMin/prevMax表示上一个值,以及还有一对curMin/curMax表示当前值。
class Solution {
public:
int maxProduct(vector<int>& nums) {
int n = nums.size();
if(n==) return ;
int dp_max_pre = nums[];
int dp_min_pre = nums[];
int dp_max;
int dp_min; int res_val = nums[];
for(int i =;i<n;i++){
dp_max = std::max( std::max(dp_max_pre*nums[i],dp_min_pre*nums[i]), nums[i]);
dp_min= std::min( std::min(dp_max_pre*nums[i],dp_min_pre*nums[i]), nums[i]);
res_val =std::max(res_val,dp_max);
dp_max_pre = dp_max;
dp_min_pre = dp_min;
} return res_val; }
};
最新文章
- secureCRT远程登录工具的颜色配置(转载)
- 快速提升word文档编写质量
- 2015 前端[JS]工程师必知必会
- 加锁解锁PHP实现 -转载
- all things are difficult before they are easy
- object-c中的类目,延展,协议
- The Swift Programming Language--语言指南--协议
- mysql基本总结
- 【卷一】正则四 |>; 练习
- Microsoft Excel 自动取数据库数据
- 安装supervisord
- Java Reflection(getXXX和getDeclaredXXX)
- 940B Our Tanya is Crying Out Loud
- HBase 数据模型
- PMP:9.项目资源管理
- vscode之快速生成vue模板
- DFS研究
- 给我一对公钥和私钥,我就能破解此RSA
- Oracle11g select查询时候输出未选定行
- 使用librtmp进行H264与AAC直播
热门文章
- WOW.js和animate.css让页面滚动时显示动画
- GDC2017【神秘海域 4】中所使用的顶点着色器技术
- Cannot create a session after the response has been committed
- 关于HOOK KiPageFault需要用到自旋锁研究
- monit介绍和配置
- Linux系统(本例以Ubuntu18.04为例)安装GCC编译器
- PXC 57 二进制安装
- poj3723_Conscription
- Ubuntu16.04 本地提权漏洞复测过程
- vue中子传父,父传子的具体用法