Skip to content

Commit 987518e

Browse files
committed
Merge pull request #8 from Mooophy/master
add solution by devide and conquer
2 parents b0b177e + 44dc59f commit 987518e

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

014. Maximum Subarray/main.cc

+4
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,9 @@ int main()
66
int A[] = {-2,1,-3,4,-1,2,1,-5,4};
77
Solution s;
88
std::cout << s.maxSubArray(A, 9) << std::endl;
9+
10+
SolutionByDivideAndConquer dac;
11+
std::cout << s.maxSubArray(A, 9) << std::endl;
12+
913
return 0;
1014
}

014. Maximum Subarray/solution.h

+41
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,44 @@ class Solution {
1212
return maxv;
1313
}
1414
};
15+
16+
class SolutionByDivideAndConquer{
17+
//O(n)
18+
int find_max_crossing_subarray(int arr[], unsigned low, unsigned mid, unsigned hgh)
19+
{
20+
auto accumulation = 0;
21+
22+
auto lft_sum = accumulation = arr[mid];
23+
if (mid > low)
24+
for (auto i = mid - 1; i != low - 1; --i)
25+
if ((accumulation += arr[i]) > lft_sum)
26+
lft_sum = accumulation;
27+
28+
auto rht_sum = accumulation = arr[mid + 1];
29+
if (hgh > mid)
30+
for (auto i = mid + 2; i != hgh + 1; ++i)
31+
if ((accumulation += arr[i]) > rht_sum)
32+
rht_sum = accumulation;
33+
34+
return lft_sum + rht_sum;
35+
}
36+
37+
//O(n lg n)
38+
int divide_and_conquer(int arr[], unsigned low, unsigned hgh)
39+
{
40+
if (low == hgh) return arr[low];
41+
42+
auto mid = (low + hgh) / 2;
43+
auto lft = divide_and_conquer(arr, low, mid);
44+
auto rht = divide_and_conquer(arr, mid + 1, hgh);
45+
auto crs = find_max_crossing_subarray(arr, low, mid, hgh);
46+
47+
return std::max({ lft, rht, crs });
48+
}
49+
50+
public:
51+
int maxSubArray(int A[], int n)
52+
{
53+
return divide_and_conquer(A, 0, n - 1);
54+
}
55+
};

0 commit comments

Comments
 (0)