Middle-题目112:152. Maximum Product Subarray

原创 2016年05月31日 20:04:08

题目原文:
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.
题目大意:
寻找最大乘积的连续子数组。
题目分析:
使用两个dp数组dpmax和dpmin,其中dpmax[i]和dpmin[i]分别表示以i为结尾的子数组的最大、最小乘积。那么初始化dpmax[0]和dpmin[0]均为nums[0],转移方程如下:
dpmax[i]=max(nums[i],dpmax[i1]nums[i],dpmin[i1]nums[i])
dpmin[i]=min(nums[i],dpmax[i1]nums[i],dpmin[i1]nums[i])
这是因为nums[i]可能是正数也可能是负数,如果是负数且前一项的最小积是负数,则会变成最大乘积,而如果最大乘积和最小乘积都是负数或0,且nums[i]是正数,则它本身是最大乘积。所以最大值和最小值可能有三种情况。
源码:(language:java)

public class Solution {
    public int maxProduct(int[] nums) {
        int length = nums.length;
        if(length==0)
            return 0;
        int[] dpmax = new int[length];
        int[] dpmin = new int[length];
        dpmax[0] = nums[0];
        dpmin[0] = nums[0];
        int max = dpmax[0];
        for(int i = 1;i<length;i++) {
            dpmax[i] = max(nums[i],dpmax[i-1]*nums[i],dpmin[i-1]*nums[i]);
            dpmin[i] = min(nums[i],dpmax[i-1]*nums[i],dpmin[i-1]*nums[i]);
            if(dpmax[i]>max)
                max=dpmax[i];
        }
        return max;
    }
    private int max(int a,int b,int c) {
        return a>b?(a>c?a:c):(b>c?b:c);
    }
    private int min(int a,int b,int c) {
        return a<b?(a<c?a:c):(b<c?b:c);
    }
}

成绩:
5ms,beats 10.47%,众数5ms,36.73%
cmershen 的碎碎念:
(1) 本题如果用一个dp数组,即dp[i][j]维护从i~j的最大乘积,也能实现但会超时。
(2) 对nums很长的情况下,可能会涉及到BigInteger高精度计算,题中没有超过int范围,故test case不够严密。
(3) 这是第一次遇到同时维护多个dp数组的题,也是拓宽了思路。

版权声明:完整版Leetcode题解请出门左转https://github.com/cmershen1/leetcode/tree/master/docs

【LeetCode-面试算法经典-Java实现】【152-Maximum Product Subarray(子数组的最大乘积)】

【152-Maximum Product Subarray(子数组的最大乘积)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】代码下载【https://github.com/Wa...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月24日 07:07
  • 2847

算法设计与分析的基础知识(1)

距离算法考试还有两周的时间,准备从现在开始用笔记的形式记录自己学习或复习算法课程的成果。不是有那么一句名言嘛:好记性不如烂笔头。Learn From Now! 算法是一系列解决问题的清晰指令,即对符合...
  • weixin_36870659
  • weixin_36870659
  • 2017年06月21日 22:02
  • 70

最大子数组问题 Maximum Subarray

Maximum Subarray: algorithm这个问题我们先看下问题的描述:问题描述Find the contiguous subarray within an array (containi...
  • liu2012huan
  • liu2012huan
  • 2016年05月02日 15:41
  • 10348

LeetCode--Maximum Subarray 最大连续子序列和 (动态规划)

动态规划-经典问题——最大连续子序列和 LeetCode--Maximum Subarray 最大连续子序列和...
  • mason_mow
  • mason_mow
  • 2014年05月25日 21:32
  • 3112

最大子序列和 Maximum Subarray

hackerank 算法->动态规划->The Maximum SubarrayGiven an array A={a1, a2, ..aN} of N elements, find the max...
  • u013342586
  • u013342586
  • 2016年07月27日 20:55
  • 207

最大子数组问题-GoLang实现

在一个数组A中寻找一个最大的子数组,这个问题可以用分治策略来求解。 首先需要划分问题,最大的子数组只有如下3中情况: 情况1:最大子序列出现在A[low]~A[mid] 情况2:最大子序列出现在A[m...
  • u013564276
  • u013564276
  • 2016年03月31日 16:55
  • 334

Maximum Subarray(最大子数组)

Maximum Subarray 我的思路: 1、以前是有做过hdoj上一个最长递增子序列的,想想那个比较麻烦,然后我使用和卖股票一样的算法。还把数组转换了一次,想想真是傻。 2、下面是我要...
  • DallasSeller
  • DallasSeller
  • 2014年11月26日 20:48
  • 353

Maximum Product Subarray 以及cout的输出顺序问题的讨论

Find the contiguous subarray within an array (containing at least one number) which has the largest ...
  • leo1949asd
  • leo1949asd
  • 2014年11月20日 19:28
  • 645

最大子数组和(The Maximum Subarray)

问题:求一个整型数组的(1)最大连续子数组和以及(2)不要求连续的最大子数组和 要求 返回的结果不能使空数组。 解答思路: (1)从前往后扫描数组,当前边累加的和大于零的时候,说明这个序...
  • ppslizejun
  • ppslizejun
  • 2016年05月15日 14:43
  • 266

最大子串和问题(Maximum Subarray)

本文转载自:http://blog.csdn.net/joylnwang/article/details/6859677 刚刚求连续子数组的最大和一个在O(n)时间内可以完成的Kadane算法,对原理...
  • willduan1
  • willduan1
  • 2016年11月10日 20:41
  • 3734
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Middle-题目112:152. Maximum Product Subarray
举报原因:
原因补充:

(最多只允许输入30个字)