• 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 };
  • 相关阅读:
    CF1452F Divide Powers 题解
    ZOJ3705Applications
    ZOJ3706Break Standard Weight
    关于技术的感悟与规划
    做自己不愿做的事叫成长,做以前不敢做的事叫突破
    CSS之盒模型
    js数组的sort排序详解
    C#接口
    jQuery UI Dialog:Demo1:入门
    CSS之position解释
  • 原文地址:https://www.cnblogs.com/jingyuewutong/p/5680400.html
Copyright © 2020-2023  润新知