📖 Scenario: You are analyzing daily profit changes of a small business over a week. You want to find the period with the highest total profit increase.
🎯 Goal: Build a program that finds the maximum sum of a contiguous subarray using the divide and conquer method.
📋 What You'll Learn
Create an integer array with exact daily profit changes
Add variables to hold the start and end indices of the subarray
Implement the divide and conquer method to find the maximum subarray sum
Print the maximum subarray sum and its start and end indices
💡 Why This Matters
🌍 Real World
Finding the maximum subarray sum helps in analyzing periods of highest profit or loss in financial data, stock prices, or sensor readings.
💼 Career
Understanding divide and conquer algorithms and maximum subarray problems is useful for software engineers working in data analysis, finance, and algorithm design.
Progress0 / 4 steps
1
Create the profit changes array
Create an integer array called profits with these exact values: 13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7
DSA C#
Hint
Use int[] profits = { ... }; with the exact numbers inside the braces.
2
Add variables for subarray indices
Add two integer variables called maxLeft and maxRight and set both to 0.
DSA C#
Hint
Declare int maxLeft = 0; and int maxRight = 0; on separate lines.
3
Implement the divide and conquer method
Write a method called FindMaxSubarray that takes the array profits, a low index, and a high index, and returns the maximum subarray sum as an integer. Use divide and conquer to find the maximum subarray sum by splitting the array and combining results. Also write a helper method called FindMaxCrossingSubarray that finds the maximum subarray crossing the midpoint. Use maxLeft and maxRight to store the start and end indices of the maximum subarray found.
DSA C#
Hint
Use recursion in FindMaxSubarray and a loop in FindMaxCrossingSubarray to find max sums on left and right sides.
4
Print the maximum subarray sum and indices
Call FindMaxSubarray with profits, 0, and profits.Length - 1. Store the returned start index in maxLeft, end index in maxRight, and sum in maxSum. Then print the maximum subarray sum and the start and end indices in this exact format: Maximum subarray sum: {maxSum}, starts at index {maxLeft}, ends at index {maxRight}.
DSA C#
Hint
Call FindMaxSubarray(profits, 0, profits.Length - 1) and unpack the result into maxLeft, maxRight, and maxSum. Then print using Console.WriteLine with the exact format.
Practice
(1/5)
1. What is the main idea behind the Divide and Conquer approach to find the maximum subarray sum?
easy
A. Calculate sum of all subarrays and pick the maximum
B. Sort the array and pick the largest element as max subarray sum
C. Use a sliding window to find the max sum subarray in one pass
D. Split the array into two halves, find max subarray in left, right, and crossing middle, then combine results
Solution
Step 1: Understand divide and conquer strategy
The array is split into two halves recursively to simplify the problem.
Step 2: Combine results from subproblems
Find max subarray in left half, right half, and crossing the middle, then take the maximum of these three.
Final Answer:
Split array, find max left, right, crossing, then combine -> Option D
Quick Check:
Divide and conquer = split and combine max subarrays [OK]
Hint: Divide array, conquer halves, combine max sums [OK]
Common Mistakes:
Thinking sorting helps find max subarray sum
Using brute force sum of all subarrays
Confusing divide and conquer with sliding window
2. Which of the following is the correct base case condition in the divide and conquer method for maximum subarray?
easy
A. If the array length is 0, return 0
B. If the array length is 1, return the single element
C. If the array length is 2, return the sum of both elements
D. If the array length is 1, return 0
Solution
Step 1: Identify base case for recursion
When the array has only one element, that element itself is the max subarray sum.
Step 2: Return the single element value
Return the value of that single element as the maximum sum.
Final Answer:
Return single element when array length is 1 -> Option B
Quick Check:
Base case = single element value [OK]
Hint: Base case: single element returns itself [OK]
Common Mistakes:
Returning 0 for single element array
Returning sum of two elements as base case
Not defining a base case causing infinite recursion
3. What will be the output of the following C# code snippet using divide and conquer to find max subarray sum?
int[] arr = { -2, 1, -3, 4, -1, 2, 1, -5, 4 };
int maxSum = FindMaxSubarray(arr, 0, arr.Length - 1);
Console.WriteLine(maxSum);
int FindMaxSubarray(int[] a, int left, int right) {
if (left == right) return a[left];
int mid = (left + right) / 2;
int leftMax = FindMaxSubarray(a, left, mid);
int rightMax = FindMaxSubarray(a, mid + 1, right);
int crossMax = FindMaxCrossingSubarray(a, left, mid, right);
return Math.Max(Math.Max(leftMax, rightMax), crossMax);
}
int FindMaxCrossingSubarray(int[] a, int left, int mid, int right) {
int leftSum = int.MinValue, sum = 0;
for (int i = mid; i >= left; i--) {
sum += a[i];
if (sum > leftSum) leftSum = sum;
}
int rightSum = int.MinValue;
sum = 0;
for (int j = mid + 1; j <= right; j++) {
sum += a[j];
if (sum > rightSum) rightSum = sum;
}
return leftSum + rightSum;
}
medium
A. 6
B. 7
C. 5
D. 4
Solution
Step 1: Identify the maximum subarray sum
The array is [-2, 1, -3, 4, -1, 2, 1, -5, 4]. The subarray [4, -1, 2, 1] (indices 3-6) sums to 6, which is the maximum.
Hint: Trace subarray sums carefully to find max [OK]
Common Mistakes:
Miscomputing crossing sum
Confusing max subarray with max element
Ignoring negative numbers impact
4. Identify the bug in this divide and conquer max subarray code snippet:
int FindMaxCrossingSubarray(int[] a, int left, int mid, int right) {
int leftSum = 0, sum = 0;
for (int i = mid; i >= left; i--) {
sum += a[i];
if (sum > leftSum) leftSum = sum;
}
int rightSum = 0;
sum = 0;
for (int j = mid + 1; j <= right; j++) {
sum += a[j];
if (sum > rightSum) rightSum = sum;
}
return leftSum + rightSum;
}
medium
A. leftSum and rightSum should be initialized to int.MinValue, not 0
B. The loops should run from left to mid and mid+1 to right respectively
C. sum variable should not be reset between loops
D. The function should return max of leftSum and rightSum, not their sum
Solution
Step 1: Check initialization of leftSum and rightSum
They are initialized to 0, which fails if all numbers are negative because max sum could be less than 0.
Step 2: Correct initialization to int.MinValue
Initialize leftSum and rightSum to int.MinValue to correctly track max sums even if negative.
Final Answer:
Initialize leftSum and rightSum to int.MinValue -> Option A
Quick Check:
Init max sums to int.MinValue to handle negatives [OK]
Hint: Init max sums to int.MinValue to handle negatives [OK]
Common Mistakes:
Initializing max sums to 0 causing wrong results
Resetting sum incorrectly between loops
Returning sum instead of max in crossing function
5. Given an array int[] arr = { -1, -2, -3, -4 }, what will the divide and conquer algorithm return as the maximum subarray sum?
hard
A. -4
B. 0
C. -1
D. -10
Solution
Step 1: Analyze array with all negative numbers
All elements are negative, so max subarray is the single largest element.
Step 2: Identify largest element
The largest element is -1, which is the max subarray sum.
Final Answer:
-1 -> Option C
Quick Check:
Max subarray in negatives = max element [OK]
Hint: Max subarray in all negatives is max element [OK]
Common Mistakes:
Returning 0 instead of max negative element
Summing all negatives incorrectly
Assuming empty subarray sum is allowed
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.