Chinaunix首页 | 论坛 | 博客
  • 博客访问: 320987
  • 博文数量: 15
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 179
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-09 18:16
文章分类

全部博文(15)

文章存档

2019年(1)

2018年(1)

2015年(7)

2013年(6)

我的朋友

分类: Java

2013-10-07 14:14:02

问题描述:给定一个整数数组,求子数组的最大和。
例如给定数组{-1, 3, 2, -3, 4, -2, 1},最大子数组为{3, 2, -3, 4},和为6.
给出两种解法,一种是暴力求解,复杂度是O(n2),另一种是分治求解,复杂度为O(nlgn)。


点击(此处)折叠或打开

  1. package basic;

  2. import java.util.Random;

  3. /**
  4.  *
  5.  * @author honglei
  6.  *
  7.  */
  8. public class FindMaximunSubArray {
  9.     
  10.     public static void main(String[] args) {
  11.         int length = 100;
  12.         int[] array = new int[length];
  13.         FindMaximunSubArray subArray = new FindMaximunSubArray();
  14.         for (int i = 0; i < length; i++) {
  15.             array[i] = (new Random().nextInt(20)) - 10;
  16.             System.out.print(array[i] + ", ");
  17.         }

  18. //        long t1 = System.currentTimeMillis();
  19.         
  20. //        subArray.findMaxSubarray(array);
  21.         MaxSumArray maxSumArray = subArray.findMaxSubarray(array, 0, length - 1);
  22.         System.out.println(maxSumArray.getStart() + ", " + maxSumArray.getEnd() + ", " + maxSumArray.getSum());
  23. //        long t2 = System.currentTimeMillis();
  24. //        System.out.println(t1);
  25. //        System.out.println(t2);
  26. //        System.out.println(t2 - t1);
  27.     }

  28.     public MaxSumArray findMaxCrossingSubarray(int array[], int low, int mid, int high) {
  29.         MaxSumArray maxSumArray = new MaxSumArray();
  30.         int leftSum = Integer.MIN_VALUE;
  31.         int sum = 0;
  32.         int maxLeft = 0;
  33.         int maxRight = 0;
  34.         for (int i = mid; i >= low; i--) {
  35.             sum = sum + array[i];
  36.             if (sum > leftSum) {
  37.                 leftSum = sum;
  38.                 maxLeft= i;
  39.             }
  40.         }
  41.         int rightSum = Integer.MIN_VALUE;
  42.         sum = 0;
  43.         for (int i = mid + 1; i <= high; i++) {
  44.             sum = sum + array[i];
  45.             if (sum > rightSum) {
  46.                 rightSum = sum;
  47.                 maxRight= i;
  48.             }
  49.         }
  50.         maxSumArray.setStart(maxLeft);
  51.         maxSumArray.setEnd(maxRight);
  52.         maxSumArray.setSum(leftSum + rightSum);
  53.         return maxSumArray;
  54.     }
  55.     
  56.     public MaxSumArray findMaxSubarray(int array[], int low, int high) {
  57.         MaxSumArray maxSumArray = new MaxSumArray();
  58.         
  59.         if (high == low) {
  60.             maxSumArray.setStart(low);
  61.             maxSumArray.setEnd(high);
  62.             maxSumArray.setSum(array[low]);
  63.         } else {
  64.             int mid = (low + high) / 2;
  65.             MaxSumArray maxSumLeft = findMaxSubarray(array, low, mid);
  66.             MaxSumArray maxSumRight = findMaxSubarray(array, mid + 1, high);
  67.             MaxSumArray maxSumCross = findMaxCrossingSubarray(array, low, mid, high);
  68.             if (maxSumLeft.getSum() >= maxSumRight.getSum() && maxSumLeft.getSum() >= maxSumCross.getSum()) {
  69.                 maxSumArray.setStart(maxSumLeft.getStart());
  70.                 maxSumArray.setEnd(maxSumLeft.getEnd());
  71.                 maxSumArray.setSum(maxSumLeft.getSum());
  72.             } else if (maxSumRight.getSum() >= maxSumLeft.getSum() && maxSumRight.getSum() >= maxSumCross.getSum()) {
  73.                 maxSumArray.setStart(maxSumRight.getStart());
  74.                 maxSumArray.setEnd(maxSumRight.getEnd());
  75.                 maxSumArray.setSum(maxSumRight.getSum());
  76.             } else {
  77.                 maxSumArray.setStart(maxSumCross.getStart());
  78.                 maxSumArray.setEnd(maxSumCross.getEnd());
  79.                 maxSumArray.setSum(maxSumCross.getSum());
  80.             }
  81.         }
  82.         return maxSumArray;
  83.     }
  84.     
  85.     public void findMaxSubarray(int[] array) {
  86.         if (array == null || array.length <= 0) {
  87.             return;
  88.         }
  89.         int sum = Integer.MIN_VALUE;
  90.         for(int i = 0; i < array.length; i++ ) {
  91.             int temp = 0;
  92.             for (int j = i; j < array.length; j++){
  93.                 temp += array[j];
  94.                 if (temp > sum) {
  95.                     sum = temp;
  96.                 }
  97.             }
  98.         }
  99.         System.out.println(sum);
  100.     }
  101.     
  102.     public class MaxSumArray {
  103.         private int start;
  104.         private int end;
  105.         private int sum;
  106.         public void setStart(int start) {
  107.             this.start = start;
  108.         }
  109.         public int getStart() {
  110.             return this.start;
  111.         }
  112.         public void setEnd(int end) {
  113.             this.end = end;
  114.         }
  115.         public int getEnd() {
  116.             return this.end;
  117.         }
  118.         public void setSum(int sum) {
  119.             this.sum = sum;
  120.         }
  121.         public int getSum() {
  122.             return this.sum;
  123.         }
  124.     }
  125. }

阅读(1150) | 评论(0) | 转发(0) |
0

上一篇:归并排序带来的性能提升

下一篇:堆排序

给主人留下些什么吧!~~