zoukankan      html  css  js  c++  java
  • [LeetCode] Maximum Product Subarray 连续数列最大积

    Find the contiguous subarray within an array (containing at least one number) which has the largest product.

    For example, given the array [2,3,-2,4],
    the contiguous subarray [2,3] has the largest product = 6.

    Hide Tags
     Array Dynamic Programming
     
        这个问题是给定一个数组,包括正负数和0,求连续子串数字最大的乘积,最容易动态规划,求出整个matrix<i,j> i-th 到 j-th 之间的数字之积,这样方法时间和空间都是O(n2),另一个比较技巧的方法,只需要O(n)时间和O(1)空间,考虑两个0 之间的数字:
    0,a,b,c,d,e,f,g,h,0
        如果a-h 之间的负数个数为偶数,那么结果就是a - h。
        如果负数个数为奇数,假如为d, 那么考虑d 的左边,最大值为a-c,右边为e-h,因为两个部分中的负数个数为偶数。
        这样在奇数情况下,只要d 去最靠近0的那个,便会有一部分是最大值。
        这样只要从左遍历一次,再从右遍历一次便能找出。
    逻辑:
    1. 判断输入个数。
    2. 设初始值,当前计算值curval = 1.
    3. 从左遍历数组。
    4. 如果遇到0,判断最大值(eg:-1,0,-2),curval =1,继续。
    5. 如果非0,那么curval 乘以该值,更新返回值。
    6. 从右遍历数组,重复4.5步,判断0就不要需要了。
     1 #include <iostream>
     2 using namespace std;
     3 
     4 class Solution {
     5 public:
     6     int maxProduct(int A[], int n) {
     7         if(n<2) return A[0];
     8         int retMax=A[0];
     9         int curval=1;
    10         for(int i=0;i<n;i++){
    11             if(A[i]==0){
    12                 if(0>retMax)   retMax=0;
    13                 curval=1;
    14                 continue;
    15             }
    16             curval*=A[i];
    17             if(curval>retMax)   retMax=curval;
    18         }
    19         curval = 1;
    20         for(int i=n-1;i>=0;i--){
    21             if(A[i]==0){
    22                 curval = 1;
    23                 continue;
    24             }
    25             curval*= A[i];
    26             if(curval>retMax)   retMax= curval;
    27         }
    28         return retMax;
    29     }
    30 };
    31 
    32 int main()
    33 {
    34     int a[]={-1,0,-2};
    35     Solution sol;
    36     cout<<sol.maxProduct(a,sizeof(a)/sizeof(int))<<endl;
    37     return 0;
    38 }
    View Code

    官方解法中结合了求最小值的解答,是一个标准的dp 过程,

    f(k) :0-th to k-th 的最大值
    g(h):0-th to k-th 的最小值
    那么有:
    f(k) = max(  f(k-1) * A[k], A[k], g(k-1) * A[k] )
    g(k) = min( g(k-1) * A[k], A[k], f(k-1) * A[k] )
     
     
     
  • 相关阅读:
    Java反射
    浅谈page,request,session,application四种范围
    使用MySQL连接池
    SQL注入漏洞的演示及解决办法
    JDBC工具类的提取
    JDBC使用过程
    MYSQL常用函数
    MySQL数据操作
    MySQL存储引擎
    Python核心技术与实战——六|异常处理
  • 原文地址:https://www.cnblogs.com/Azhu/p/4148248.html
Copyright © 2011-2022 走看看