@@ -12,3 +12,44 @@ class Solution {
12
12
return maxv;
13
13
}
14
14
};
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