博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分治思想实现求连续子数组的最大和
阅读量:6869 次
发布时间:2019-06-26

本文共 1620 字,大约阅读时间需要 5 分钟。

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

  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));    }}复制代码

转载地址:http://zecfl.baihongyu.com/

你可能感兴趣的文章
The producer group has been created before
查看>>
老李分享:Robotium编写测试用例如何模拟Junit4的BeforeClass和AfterClass方法2
查看>>
liunx-定时任务
查看>>
重新设计网站的10点建议
查看>>
API概述
查看>>
iOS中UIDocumentInteractionController的使用
查看>>
System.currentTimeMillis() 获取当前系统时间
查看>>
做了两个月的销售的感慨
查看>>
视频处理,歪题,VEGAS笔记
查看>>
centos7 使用 omnibus包安装方式,安装 gitlab7.4
查看>>
思科路由器指定dns
查看>>
Job 失败了怎么办?- 每天5分钟玩转 Docker 容器技术(133)
查看>>
oracle 表空间不够的处理
查看>>
python2.6 安装rsa的包
查看>>
undo表空间使用率过高,且迟迟不释放问题
查看>>
centOS 6.4 安装
查看>>
scons *** no sconstruct file found求解决办法
查看>>
BIND基础配置详解
查看>>
火狐增加安全端口,每次用都得查,好麻烦,自己记录一下
查看>>
c# 多线程排队队列实现的源码
查看>>