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
.
该题做的泪流满面,第一次暴力遍历一个爆长的case超时,
仔细观察后发现其实乘积是有规律的,只需要考虑数组中负数的个数,和处理出现0的情况即可。
写代码的过程中,由于多次考虑不周全,导致出现Wrong Answer。改了N次之后终于AC
public static int maxProduct(int[] A) {
int total = 0 ,econdSegmentTotal = 0 ,firstSegmentTotal = 0 ;
int negetiveCount = 0;
int startElementPos = 0;int secondElementPos = 0;
int result = A[0];
for(int i = 0; i < A.length ; ++i){
if(A[i] == 0){
if(result < total){
result = total;
}
if(result < 0){
result = 0;
}
startElementPos = i+1;
secondElementPos = i+1;
negetiveCount = 0;
}else{
if(A[i] < 0){
negetiveCount++;
if(negetiveCount == 1){
secondElementPos = i+1;
}
if(negetiveCount % 2 == 0){
firstSegmentTotal *= A[i];
econdSegmentTotal *= A[i];
total = (total < firstSegmentTotal ? firstSegmentTotal:total);
}else{
econdSegmentTotal *= A[i];
total = (total < firstSegmentTotal ? firstSegmentTotal:total);
total = (total < econdSegmentTotal ? econdSegmentTotal:total);
firstSegmentTotal *= A[i];
}
}else{
firstSegmentTotal *= A[i];
econdSegmentTotal *= A[i];
total = (total < firstSegmentTotal ? firstSegmentTotal:total);
total = (total < econdSegmentTotal ? econdSegmentTotal:total);
}
}
if(secondElementPos == i){
econdSegmentTotal = A[i];
total = (total < firstSegmentTotal ? firstSegmentTotal:total);
total = (total < econdSegmentTotal ? econdSegmentTotal:total);
}
if(startElementPos == i){
total = econdSegmentTotal = firstSegmentTotal = A[i];
}
}
return result > total ? result:total;
}