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; }
};

最新文章

  1. secureCRT远程登录工具的颜色配置(转载)
  2. 快速提升word文档编写质量
  3. 2015 前端[JS]工程师必知必会
  4. 加锁解锁PHP实现 -转载
  5. all things are difficult before they are easy
  6. object-c中的类目,延展,协议
  7. The Swift Programming Language--语言指南--协议
  8. mysql基本总结
  9. 【卷一】正则四 |&gt; 练习
  10. Microsoft Excel 自动取数据库数据
  11. 安装supervisord
  12. Java Reflection(getXXX和getDeclaredXXX)
  13. 940B Our Tanya is Crying Out Loud
  14. HBase 数据模型
  15. PMP:9.项目资源管理
  16. vscode之快速生成vue模板
  17. DFS研究
  18. 给我一对公钥和私钥,我就能破解此RSA
  19. Oracle11g select查询时候输出未选定行
  20. 使用librtmp进行H264与AAC直播

热门文章

  1. WOW.js和animate.css让页面滚动时显示动画
  2. GDC2017【神秘海域 4】中所使用的顶点着色器技术
  3. Cannot create a session after the response has been committed
  4. 关于HOOK KiPageFault需要用到自旋锁研究
  5. monit介绍和配置
  6. Linux系统(本例以Ubuntu18.04为例)安装GCC编译器
  7. PXC 57 二进制安装
  8. poj3723_Conscription
  9. Ubuntu16.04 本地提权漏洞复测过程
  10. vue中子传父,父传子的具体用法