最大连续子数组的积
不考虑溢出,注意多个0,多个负数,还有结果是1的情况
public class MaxSubMultiplication {
public static int calculate(int[] array) {
int lastZeroIndex = -1;
int indexOfFirstNegative = -1;
int indexOfLastNegative = -1;
int mulBeforeFirst = 1;
int mulAfterLast = 1;
int mulOfAll = 1;
boolean hasPositive = false;
int max = 0;
for (int i = 0; i < array.length; i++) {
if (array[i] == 0) {
if (mulOfAll > 0) {
if (max < mulOfAll)
max = mulOfAll;
} else if (mulOfAll < 0) {
for (int j = lastZeroIndex + 1; j <= indexOfFirstNegative - 1; j++) {
mulBeforeFirst *= array[j];
}
for (int k = indexOfLastNegative + 1; k <= i - 1; k++) {
mulAfterLast *= array[k];
}
int cadidateOne = (mulOfAll / mulBeforeFirst) / array[indexOfFirstNegative];
int cadidateTwo = (mulOfAll / mulAfterLast) / array[indexOfLastNegative];
int result = maxOfFour(mulBeforeFirst, mulAfterLast, cadidateOne, cadidateTwo);
if (max < result)
max = result;
}
lastZeroIndex = i;
indexOfFirstNegative = -1;
indexOfLastNegative = -1;
mulBeforeFirst = 1;
mulAfterLast = 1;
mulOfAll = 1;
} else {
if (array[i] < 0) {
if (indexOfFirstNegative < 0)
indexOfFirstNegative = i;
indexOfLastNegative = i;
}
mulOfAll *= array[i];
if (mulOfAll > 0 || array[i] > 0)
hasPositive = true;
}
}
if (mulOfAll > 0) {
if (max < mulOfAll)
max = mulOfAll;
} else if (mulOfAll < 0) {
for (int j = lastZeroIndex + 1; j <= indexOfFirstNegative - 1; j++) {
mulBeforeFirst *= array[j];
}
for (int k = indexOfLastNegative + 1; k <= array.length - 1; k++) {
mulAfterLast *= array[k];
}
int cadidateOne = (mulOfAll / mulBeforeFirst) / array[indexOfFirstNegative];
int cadidateTwo = (mulOfAll / mulAfterLast) / array[indexOfLastNegative];
int result = maxOfFour(mulBeforeFirst, mulAfterLast, cadidateOne, cadidateTwo);
if (max < result)
max = result;
}
return (max != 1) ? max : (hasPositive ? max : 0);
}
private static int maxOfFour(int a, int b, int c, int d) {
int max = a;
if (max < b)
max = b;
if (max < c)
max = c;
if (max < d)
max = d;
return max;
}
public static void main(String[] args) {
int[] array = { -1, 0, -2, 1, 0, -6, 0, -7 };
System.out.println(MaxSubMultiplication.calculate(array));
}
}