-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMaxSubarray.c
68 lines (60 loc) · 1.1 KB
/
MaxSubarray.c
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
int maxSubArray(int A[], int n)
{
int sum, beg, end, max;
sum = 0;
max = A[0];
beg = end = 0;
while (end < n) {
sum += A[end];
if (sum > max)
max = sum;
if (sum < 0) {
sum = 0;
end++;
beg = end;
continue;
}
end++;
}
return max;
}
//分治法
int max2(int a, int b)
{
return a > b ? a : b;
}
int max3(int a, int b, int c)
{
return max2(max2(a, b), c);
}
int submax(int A[], int l, int u)
{
int mid, lmax, rmax, mmax;
int i, sum, tem;
if (l == u)
return A[l];
mid = (l + u) / 2;
tem = sum = A[mid];
for (i = mid-1; i >= l; i++)
{
sum += A[i];
if (sum > tem)
tem = sum;
}
mmax = tem;
tem = sum = A[mid+1];
for (i = mid+2; i <= u; i++)
{
sum += A[i];
if (sum > tem)
tem = sum;
}
mmax += tem;
lmax = submax(A, l, mid);
rmax = submax(A, mid+1, u);
return max3(lmax, mmax, rmax);
}
int maxSubArray(int A[], int n)
{
return submax(A, 0, n-1);
}