读书人

最大连市续子数组的积

发布时间: 2013-01-28 11:49:56 作者: rapoo

最大连续子数组的积
最大连续子数组的积

不考虑溢出,注意多个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));    }}

?

?

读书人网 >行业软件

热点推荐