1 package com.algorithm.test;
2 /**
3 * 最大子序列
4 * @author LiFen
5 *
6 */
7 public class LargestSubsequence {
8 public static void main(String[] args) {
9 int[] arr = {4,-3,5,-2,-1,2,6,-2};
10 System.out.println(maxSubSum(arr));
11
12 System.out.println(maxSumRec(arr, 0, arr.length - 1));
13
14 System.out.println(maxSubSum2(arr));
15 }
16
17 /*
18 * 时间复杂度O(N*N)
19 */
20 public static int maxSubSum(int [] a) {
21 int maxSum = 0;
22
23 for(int i = 0; i < a.length; i++) {
24 int thisSum = 0;
25 for(int j = 0; j < a.length; j++) {
26
27 thisSum += a[j];
28
29 if(thisSum > maxSum)
30 maxSum = thisSum;
31 }
32 }
33 return maxSum;
34 }
35 /*
36 * 递归
37 * 时间复杂度O(N logN)
38 */
39 public static int maxSumRec(int [] a, int left, int right) {
40 if(left == right) {
41 if(a[left] > 0)
42 return a[left];
43 else return 0;
44 }
45
46 int center = (left + right) / 2;
47 int maxLeftSum = maxSumRec(a, left, center);
48 int maxRightSum = maxSumRec(a, center + 1, right);
49
50 int maxLeftBorderSum = 0,leftBorderSum = 0;
51 for(int i = center; i >= left; i--) {
52 leftBorderSum += a[i];
53 if(leftBorderSum > maxLeftBorderSum)
54 maxLeftBorderSum = leftBorderSum;
55 }
56
57 int maxRightBorderSum = 0, rightBoderSum = 0;
58 for(int i = center + 1; i <= right; i++) {
59 rightBoderSum += a[i];
60 if(rightBoderSum > maxRightBorderSum)
61 maxRightBorderSum = rightBoderSum;
62 }
63 return Math.max(Math.max(maxLeftSum, maxRightSum),maxLeftBorderSum + maxRightBorderSum);
64 }
65 /*
66 * 联机算法
67 * 快
68 */
69 public static int maxSubSum2(int [] a) {
70 int maxSum = 0, thisSum = 0;
71
72 for(int i = 0; i < a.length; i++) {
73 thisSum += a[i];
74
75 if(thisSum > maxSum) {
76 maxSum = thisSum;
77 }else if(thisSum < 0){
78 thisSum = 0;
79 }
80 }
81 return maxSum;
82 }
83 }