-
Notifications
You must be signed in to change notification settings - Fork 17
Expand file tree
/
Copy pathMaxSubSum.java
More file actions
119 lines (97 loc) · 2.94 KB
/
Copy pathMaxSubSum.java
File metadata and controls
119 lines (97 loc) · 2.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package ch02;
import java.util.ArrayList;
import java.util.LinkedList;
/**
* Created by cookfront on 2017/2/14.
*/
public class MaxSubSum {
public static void main(String ...args) {
int[] subs = {-2, 11, -4, 13, -5, -2};
System.out.println(maxSubSum1(subs));
System.out.println(maxSubSum2(subs));
System.out.println(maxSubSum4(subs));
}
public static int maxSubSum1(int[] arr) {
int maxSum = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = i; j < arr.length; j++) {
int thisSum = 0;
for (int k = i; k <= j; k++) {
thisSum += arr[k];
}
if (thisSum > maxSum) {
maxSum = thisSum;
}
}
}
return maxSum;
}
public static int maxSubSum2(int[] arr) {
int maxSum = 0;
for (int i = 0; i < arr.length; i++) {
int thisSum = 0;
for (int j = i; j < arr.length; j++) {
thisSum += arr[j];
if (thisSum > maxSum) {
maxSum = thisSum;
}
}
}
return maxSum;
}
public static int maxSumRec(int[] arr, int left, int right) {
if (left == right) {
if (arr[left] > 0) {
return arr[left];
} else {
return 0;
}
}
int center = (left + right / 2);
int maxLeftSum = maxSumRec(arr, left, center);
int maxRightSum = maxSumRec(arr, center + 1, right);
int maxLeftBorderSum = 0;
int leftBorderSum = 0;
for (int i = center; i >= left; i--) {
leftBorderSum += arr[i];
if (leftBorderSum > maxLeftBorderSum) {
maxLeftBorderSum = leftBorderSum;
}
}
int maxRightBorderSum = 0;
int rightBorderSum = 0;
for (int i = center + 1; i <= right; i++) {
rightBorderSum += arr[i];
if (rightBorderSum > maxRightBorderSum) {
maxRightBorderSum = rightBorderSum;
}
}
return max3(maxLeftSum, maxRightSum, maxLeftBorderSum + maxRightBorderSum);
}
public static int max3(int a, int b, int c) {
if (a > b && a > c) {
return a;
} else if (b > a && b > c) {
return b;
} else if (c > a && c > b) {
return c;
}
return Integer.MIN_VALUE;
}
public static int maxSubSum3(int[] arr) {
return maxSumRec(arr, 0, arr.length - 1);
}
public static int maxSubSum4(int[] arr) {
int maxSum = 0;
int thisSum = 0;
for (int i = 0; i < arr.length; i++) {
thisSum += arr[i];
if (thisSum > maxSum) {
maxSum = thisSum;
} else if (thisSum < 0) {
thisSum = 0;
}
}
return maxSum;
}
}