zoukankan      html  css  js  c++  java
  • leetcode-Maximum Product Subarray-ZZ

    http://blog.csdn.net/v_july_v/article/details/8701148

    假设数组为a[],直接利用动归来求解,考虑到可能存在负数的情况,我们用Max来表示以a结尾的最大连续子串的乘积值,用Min表示以a结尾的最小的子串的乘积值,那么状态转移方程为:

           Max=max{a[i], Max[i-1]*a[i], Min[i-1]*a[i]};
           Min=min{a[i], Max[i-1]*a[i], Min[i-1]*a[i]};
        初始状态为Max[0]=Min[0]=a[0]。

     1 #include <iostream>
     2 #include <cmath>
     3 #include <algorithm>
     4 using namespace std;
     5 class Solution {
     6 public:
     7     int maxProduct(int A[], int n) {
     8         int *maxArray = new int[n];
     9         int *minArray = new int[n];
    10         maxArray[0] = minArray[0] = A[0];
    11         int result=maxArray[0];
    12         for (int i = 1; i < n; i++)
    13         {
    14             maxArray[i] = max(max(maxArray[i-1]*A[i],minArray[i-1]*A[i]),A[i]);
    15             minArray[i] = min(min(maxArray[i-1]*A[i],minArray[i-1]*A[i]),A[i]);
    16             result = max(result,maxArray[i]);
    17         }
    18         return result;
    19     }
    20 };
    21 int main()
    22 {
    23     Solution s;
    24     int n = 4;
    25     int a[] = {2,3,-2,4};
    26     cout << s.maxProduct(a,4)<<endl;
    27     return 0;
    28 }

     

    ==============================================================================================

    LinkedIn - Maximum Sum/Product Subarray 

    Maximum Sum Subarray是leetcode原题,跟Gas Station的想法几乎一模一样。解答中用到的结论需要用数学简单地证明一下。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public int maxSubArray(int[] A) {
        int sum = 0;
        int max = Integer.MIN_VALUE;
        for (int i = 0; i < A.length; i++) {
            sum += A[i];
            if (sum > max)
                max = sum;
            if (sum < 0)
                sum = 0;
        }
        return max;
    }

    Maximum Product Subarray其实只需要不断地记录两个值,max和min。max是到当前为止最大的正product,min是到当前为止最小的负product,或者1。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public int maxProduct(int[] A) {
        int x = 1;
        int max = 1;
        int min = 1;
        for (int i = 0; i < A.length; i++) {
            if (A[i] == 0) {
                max = 1;
                min = 1;
            } else if (A[i] > 0) {
                max = max * A[i];
                min = Math.min(min * A[i], 1);
            } else {
                int temp = max;
                max = Math.max(min * A[i], 1);
                min = temp * A[i];
            }
            if (max > x)
                x = max;
        }
        return x;
    }

    http://shepherdyuan.wordpress.com/2014/07/23/linkedin-maximum-sumproduct-subarray/

  • 相关阅读:
    16 IO流(十三)——Object流 序列化与反序列化
    java.IO.EOFException异常
    15 IO流(十二)——数据流Data InputStream/OutputStream 未学会
    14 IO流(十一)——装换流InputStreamReader与OutputStreamWriter
    13 IO流(十)——BufferedReader/BufferedWriter 装饰流
    12 IO流(九)——装饰流 BufferedInputStream/OutputStream
    11 IO流(八)——装饰器设计模式,Filter装饰流
    10 IO流(七)——copy方法封装、关闭流方法封装的两种方式以及try...with...resource
    09 IO流(六)——ByteArray字节流、流对接
    新手学习PHP的避雷针,这些坑在PHP开发中就别跳了
  • 原文地址:https://www.cnblogs.com/forcheryl/p/3992327.html
Copyright © 2011-2022 走看看