题目: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
.
思路:之前写过一题Maximun Subarray,用DP算法,maxEndHere的思路,时间复杂度为O(n)。附上之前的博客:http://blog.csdn.net/u013127687/article/details/50809675
该题模范之前题目的思路,也采用DP以及maxEndHere的思路,但是细节方面有所不同。之前求和,如果是负数,max肯定是一直减小,但是本题中,如果出现负数,max的确变小了,但是再出现一次负数,max会增大。所以本题中维护了两个变量:maxEndHere以及minEndHere。
maxEndHere=max{nums[i] , nums[i]*maxEndHere , nums[i]*minEndHere}
minEndHere=min{nums[i] , nums[i]*maxEndHere , nums[i]*minEndHere}
最终返回maxEndHere的最大值。
代码:
public int maxProduct(int[] nums) {
int max=nums[0];
int maxEndHere=nums[0];
int minEndHere=nums[0];
for(int i=1;i<nums.length;i++){
int i1=maxEndHere*nums[i];
int i2=minEndHere*nums[i];
maxEndHere=Math.max(Math.max(i1, i2),nums[i]);
minEndHere=Math.min(Math.min(i1, i2),nums[i]);
max=Math.max(maxEndHere, max);
}
return max;
}