第四章 分治策略 4.1 最大子数组问题 (减治法,别人的,拿来看看)

/**
     * 获得连续子数组的最大和
     * 
     * @author dfeng
     * 
     */

    private static long getMax(long a, long b) {
        return a > b ? a : b;
    }

    /**
     * 获得连续子数组的最大和
     * 
     * @param array
     * @return 最大和,此处用了Long型是为了表示当参数为null或空时,可以返回null,返回其它任何数字都可能引起歧义。
     */
    public static Long getMax(int[] array) {

        if (array == null || array.length <= 0) {
            return null;
        }

        long maxSum = array[0]; // 所有子数组中最大的和
        long righteEdge = array[0]; // 右侧子数组的最大和
        for (int i = 1; i < array.length; i++) {
            // 当右侧子数组的最大和为负数时,对于新数组,右侧子数组的最大和为新增加的数。
            if (righteEdge < 0) {
                righteEdge = array[i];
            } else { // 为正数时,对于新数组,右侧子数组的最大和为新增加的数 + 原来的最大和。
                righteEdge += array[i];
            }
            // 所有子数组中最大的和
            maxSum = getMax(righteEdge, maxSum);
        }
        return maxSum;
    }

    public static void main(String[] args) {
        int[] array = { -111, -2, -3, -10, -4, -7, -2, -5 };
        System.out.println("Max sum: " + getMax(array));
    }
posted @ 2014-06-07 16:55  JintaoXIAO  阅读(270)  评论(0编辑  收藏  举报