Skip to content

Commit 3e4cce3

Browse files
committed
update: added 3rd approach using divide & conquer
1 parent 9a98c48 commit 3e4cce3

File tree

1 file changed

+42
-2
lines changed

1 file changed

+42
-2
lines changed

β€ŽBasic programs/revision/MaximumSubarrayLC53.javaβ€Ž

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public static int maxSubArray1(int[] nums) {
2121
}
2222

2323
// using DP - O(N) Time | O(N) Space
24-
public static int maxSubArray(int[] nums) {
24+
public static int maxSubArray2(int[] nums) {
2525

2626
int[] dp = new int[nums.length];
2727
dp[0] = nums[0];
@@ -30,7 +30,6 @@ public static int maxSubArray(int[] nums) {
3030

3131
for (int i = 1; i < nums.length; i++) {
3232

33-
// dp[i] = (nums[i] > dp[i - 1]) ? nums[i] : nums[i] + dp[i - 1];
3433
dp[i] = Math.max(nums[i], nums[i] + dp[i - 1]);
3534

3635
maxsum = Math.max(maxsum, dp[i]);
@@ -39,6 +38,47 @@ public static int maxSubArray(int[] nums) {
3938
return maxsum;
4039
}
4140

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+
4282
public static void main(String[] args) {
4383
int[] arr = { -2, 1, -3, 4, -1, 2, 1, -5, 4 };
4484
System.out.println(maxSubArray(arr));

0 commit comments

Comments
Β (0)