@@ -21,7 +21,7 @@ public static int maxSubArray1(int[] nums) {
21
21
}
22
22
23
23
// using DP - O(N) Time | O(N) Space
24
- public static int maxSubArray (int [] nums ) {
24
+ public static int maxSubArray2 (int [] nums ) {
25
25
26
26
int [] dp = new int [nums .length ];
27
27
dp [0 ] = nums [0 ];
@@ -30,7 +30,6 @@ public static int maxSubArray(int[] nums) {
30
30
31
31
for (int i = 1 ; i < nums .length ; i ++) {
32
32
33
- // dp[i] = (nums[i] > dp[i - 1]) ? nums[i] : nums[i] + dp[i - 1];
34
33
dp [i ] = Math .max (nums [i ], nums [i ] + dp [i - 1 ]);
35
34
36
35
maxsum = Math .max (maxsum , dp [i ]);
@@ -39,6 +38,47 @@ public static int maxSubArray(int[] nums) {
39
38
return maxsum ;
40
39
}
41
40
41
+ // using divide and conquer
42
+ private static int [] numsArr ;
43
+
44
+ public static int maxSubArray (int [] nums ) {
45
+
46
+ numsArr = nums ;
47
+
48
+ return findMaxSubarray (0 , numsArr .length - 1 );
49
+ }
50
+
51
+ // helper recusive method
52
+ private static int findMaxSubarray (int left , int right ) {
53
+ if (left > right )
54
+ return Integer .MIN_VALUE ;
55
+
56
+ int mid = left + (right - left ) / 2 ;
57
+ int currSum = 0 ;
58
+ int leftMaxSum = 0 , rightMaxSum = 0 ;
59
+
60
+ // finding max subarray sum in left half
61
+ for (int i = mid - 1 ; i >= left ; i --) {
62
+ currSum += numsArr [i ];
63
+ leftMaxSum = Math .max (leftMaxSum , currSum );
64
+ }
65
+
66
+ // finding in right half
67
+ currSum = 0 ;
68
+ for (int i = mid + 1 ; i <= right ; i ++) {
69
+ currSum += numsArr [i ];
70
+ rightMaxSum = Math .max (rightMaxSum , currSum );
71
+ }
72
+ // considering middle element also
73
+ int combinedSum = numsArr [mid ] + leftMaxSum + rightMaxSum ;
74
+
75
+ int leftHalfSum = findMaxSubarray (left , mid - 1 );
76
+ int rightHalfSum = findMaxSubarray (mid + 1 , right );
77
+
78
+ int result = Math .max (combinedSum , Math .max (leftHalfSum , rightHalfSum ));
79
+ return result ;
80
+ }
81
+
42
82
public static void main (String [] args ) {
43
83
int [] arr = { -2 , 1 , -3 , 4 , -1 , 2 , 1 , -5 , 4 };
44
84
System .out .println (maxSubArray (arr ));
0 commit comments