分治思想实现求连续子数组的最大和

基本的思路是:计算中点,将数组不断细分为更小的数组。连续子数组的最大和只能在以下三种情况产生:

  1. 连续子数组的最大和在中点的左边产生
  2. 连续子数组的最大和在中点的右边产生
  3. 连续子数组的最大和跨越中点
根据上述思路,我们很容易写出如下代码:

public class MaxSubClass {
    static int[] arr = {1, -2, 3, 10, -4, 7, 2, -5};

    //求最大子数组
    public int getMaxSubArray(int[] array, int low, int high) {
        if (low == high)
            return array[low];
        //第一种情况最大子数组在左边的数组产生
        int mid = (low + high) / 2;
        int maxLeft = getMaxSubArray(array, low, mid);
        //第二种情况最大子数组在右边的数组产生
        int maxRight = getMaxSubArray(array, mid + 1, high);
        //第三种情况最大子数组跨越中点产生
        int maxCross = getMaxCrossSubArray(array, low, mid, high);
        //取三者的最大值
        int max = maxLeft > maxRight ? maxLeft : maxRight;
        max = maxCross > max ? maxCross : max;

        return max;
    }

    //求跨中点的最大子数组
    public int getMaxCrossSubArray(int[] array, int low, int mid, int high) {
        int leftMaxSum = array[mid];
        int leftSum = array[mid];
        int leftIndex = mid;
        for (int i = mid -1 ; i >= low; i--) {
            leftSum = leftSum + array[i];
            if (leftSum > leftMaxSum)
                leftMaxSum = leftSum;
        }

        int rightMaxSum = 0;
        int rightSum = 0;
        int rightIndex = mid;
        for (int j = mid + 1; j <= high; j++) {
            rightSum = rightSum + array[j];
            if (rightSum > rightMaxSum)
                rightMaxSum = rightSum;
        }

        int max = leftMaxSum + rightMaxSum;
        return max;
    }

    public static void main(String[] args) {
        MaxSubClass mc = new MaxSubClass();
        System.out.println(mc.getMaxSubArray(arr, 0, arr.length - 1));
    }
}复制代码


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值