zoukankan      html  css  js  c++  java
  • 152. Maximum Product Subarray

    本题大意:找出给定数组中的子数组(连续),使得所得的子数组中元素乘积在所有子数组的元素乘积中最大。例如:给定数组为:[2,3,-2,4],那么所求的连续子数组应为[2,3],它的乘积最大,为6。

    解题思路:dp算法。假定当前元素为nums[j],记dp1[j]为以nums[j]为结尾的子数组的最大乘积,dp2[j]为以nums[j]结尾的子数组的最小乘积。

    那么dp1[j]取决于什么呢?有三种可能:

    1、当前的nums[j];2、dp1[j-1]*nums[j];3、dp2[j-1]*nums[j];

    第三种情况例如,如果当前nums[j]为负数,恰好之前还有奇数个负数,就应该用之前的最小值dp2[j-1]来乘当前值nums[j]。

    dp2[j]取决于什么呢?也有三种可能:

    1、当前的nums[j];2、dp2[j-1]*nums[j];3、dp1[j-1]*nums[j];

    第三种情况例如,如果当前nums[j]为负数,恰好之前还有偶数个负数,就应该用之前的最大值dp1[j-1]来乘当前值nums[j]。

    代码如下:

     1 class Solution {
     2 public:
     3     int maxProduct(vector<int>& nums) {
     4         if(nums.empty()) return 0;
     5         int n = nums.size();
     6         int dp1[n];
     7         int dp2[n];
     8         int maxP = nums[0];
     9         int minP = nums[0];
    10         dp1[0] = nums[0];
    11         dp2[0] = nums[0];
    12         for(int j = 1; j < n; j++)
    13         {
    14             dp2[j] = min(dp2[j-1]*nums[j], min(nums[j], dp1[j-1]*nums[j]));
    15             dp1[j] = max(dp1[j-1]*nums[j], max(nums[j], dp2[j-1]*nums[j]));
    16             maxP = max(maxP, dp1[j]);
    17         }
    18         return maxP;
    19     }
    20 };
  • 相关阅读:
    Java集合之ArrayList
    深入理解Java中的String
    Spring系列之AOP实现的两种方式
    设计模式之代理模式
    使用 Composer 为 ThinkPHP(3.2.3)框架添加和管理组件
    滚动页面, 顶部导航栏固定效果
    nginx同一iP多域名配置方法
    nginx 服务器重启命令,关闭
    CentOS Linux服务器安全设置
    CentOS7安装iptables防火墙
  • 原文地址:https://www.cnblogs.com/jingyuewutong/p/5680400.html
Copyright © 2011-2022 走看看