首页 > 其他 > 详细

Maximum Product Subarray

时间:2015-03-21 11:03:05      阅读:416      评论:0      收藏:0      [点我收藏+]

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.

思路:

  动态规划

  整体的最优解等于遍历所有的局部最优解中的最优解

  动态规划方程:

  max_local[i + 1] = Max(Max(max_local[i] * A[i], A[i]),  min_local * A[i])

  min_local[i + 1] = Min(Min(max_copy[i] * A[i], A[i]),  min_local * A[i])

我的代码:

技术分享
public class Solution {
    public int maxProduct(int[] A) {
        if(A == null || A.length == 0) return 0;
        int n = A.length;
        int max = A[0];
        int[] maxLocal = new int[n];
        int[] minLocal = new int[n];
        maxLocal[0] = A[0];
        minLocal[0] = A[0];
        for(int i = 1; i < n; i++)
        {
            int localMax = maxLocal[i-1];
            maxLocal[i] = Math.max(Math.max(A[i],maxLocal[i-1]*A[i]),A[i]*minLocal[i-1]);
            minLocal[i] = Math.min(Math.min(A[i],minLocal[i-1]*A[i]),A[i]*localMax);
            max = Math.max(max,maxLocal[i]);
        }
        return max;
    }
}
View Code
  • 求解数组总整体的最优解最重要的思想就是整体的最优解等于遍历所有的局部最优解中的最优解
  • 该问题让我联想到了之前做的Maximum Subarray问题,之前一直是用的数学推导的方法,现在也替换成动态规划的方法,代码如下:
技术分享
public class Solution {
    public int maxSubArray(int[] A) {
        if(A == null || A.length == 0) return 0;
        int n = A.length;
        int[] localMax = new int[n];
        localMax[0] = A[0];
        int max = A[0];
        for(int i = 1; i < n; i++)
        {
            localMax[i] = Math.max(localMax[i-1]+A[i],A[i]);
            max = Math.max(max,localMax[i]);
        }
        return max;
    }
}
View Code
  • 局部最优解和前面的局部最优解有关系,要不要加上前面的?加上之后的效果是什么样子的?这是需要在循环里面更新的内容。

 

Maximum Product Subarray

原文:http://www.cnblogs.com/sunshisonghit/p/4355203.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!