152. Maximum Product Subarray

来源:互联网 发布:知乎 堵门 编辑:程序博客网 时间:2024/04/26 08:33

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.

乘到0肯定是会变0的,先找一段没有0的序列来看看,乘法负负得正,所以应该尽可能地多取元素才能使乘积最大,如果负数有偶数个,那么取全部元素就可以了,如果负数有奇数个,需要舍弃一部分,舍弃的这一部分一定是要么靠近左端点要么靠近右端点包含第一个负数的区间。做法就是按0把数组切开,每部分分别处理求最大。

public int maxProduct(int[] nums){int len=nums.length;if(len<2)return nums[0];int[] zeroindex=new int[len+2];zeroindex[0]=-1;int cnt=1;for(int i=0;i<len;i++)if(nums[i]==0)zeroindex[cnt++]=i;zeroindex[cnt++]=len;int max=0;for(int i=0;i<cnt-1;i++){int left=zeroindex[i];int right=zeroindex[i+1];if(right-left>=2)max=Math.max(max, maxproductaux(nums, left+1, right-1));}return max;}public int maxproductaux(int[] nums,int start,int end){if(start==end)return nums[start];int negcount=0;int firstneg=-1;int lastneg=-1;int mul=1;for(int i=start;i<=end;i++){if(nums[i]<0){lastneg=i;if(firstneg==-1)firstneg=i;negcount++;}mul*=nums[i];}if(negcount%2==0)return mul;int a=mul;int b=mul;for(int i=firstneg;i>=start;i--)a/=nums[i];for(int i=lastneg;i<=end;i++)b/=nums[i];return Math.max(a, b);}

----------------------------------------------------------------------------------------------------------

摘一个DP的解法,摘自:

http://www.cnblogs.com/ganganloveu/p/4089925.html

http://blog.csdn.net/salutlu/article/details/39560795


Analysis:

similar like Maximum Subarray question

difference is the max value could be get from 3 situations

current maxValue * A[i]  if A[i]>0

current minValue * A[i]  if A[i]<0

A[i]  

We need to record current maxValue, current minValue and update them every time get the new product


class Solution {public:    int maxProduct(vector<int>& nums) {        if(nums.empty())            return 0;        if(nums.size() == 1)            return nums[0];                    int maxAll = nums[0];       //global maximum        int maxLast = nums[0];      //maximum including last element        int maxCur;                 //maximum including current element        int minLast = nums[0];      //minimum including current element        int minCur;                 //minimum including last element        for(int i = 1; i < nums.size(); i ++)        {            maxCur = max(nums[i], max(maxLast*nums[i], minLast*nums[i]));            minCur = min(nums[i], min(maxLast*nums[i], minLast*nums[i]));            maxLast = maxCur;            minLast = minCur;            maxAll = max(maxAll, maxCur);        }        return maxAll;    }};


0 0
原创粉丝点击