Challenge - 5 Problems
Master of Maximum Subarray Divide and Conquer
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediateOutput of Maximum Subarray Sum Using Divide and Conquer
What is the output of the following C++ code that finds the maximum subarray sum using divide and conquer?
DSA C++
#include <iostream> #include <vector> #include <algorithm> #include <climits> using namespace std; int maxCrossingSum(const vector<int>& arr, int left, int mid, int right) { int sum = 0; int left_sum = INT_MIN; for (int i = mid; i >= left; i--) { sum += arr[i]; if (sum > left_sum) left_sum = sum; } sum = 0; int right_sum = INT_MIN; for (int i = mid + 1; i <= right; i++) { sum += arr[i]; if (sum > right_sum) right_sum = sum; } return left_sum + right_sum; } int maxSubArraySum(const vector<int>& arr, int left, int right) { if (left == right) return arr[left]; int mid = (left + right) / 2; int left_max = maxSubArraySum(arr, left, mid); int right_max = maxSubArraySum(arr, mid + 1, right); int cross_max = maxCrossingSum(arr, left, mid, right); return max({left_max, right_max, cross_max}); } int main() { vector<int> arr = {-2, 1, -3, 4, -1, 2, 1, -5, 4}; cout << maxSubArraySum(arr, 0, arr.size() - 1) << endl; return 0; }
Attempts:
2 left
💡 Hint
Think about the subarray with the largest sum in the array {-2, 1, -3, 4, -1, 2, 1, -5, 4}.
✗ Incorrect
The maximum subarray is [4, -1, 2, 1] which sums to 6. The divide and conquer approach correctly finds this sum.
❓ Predict Output
intermediateOutput of Maximum Subarray Sum for All Negative Numbers
What is the output of the following C++ code when the input array contains all negative numbers?
DSA C++
#include <iostream> #include <vector> #include <algorithm> #include <climits> using namespace std; int maxCrossingSum(const vector<int>& arr, int left, int mid, int right) { int sum = 0; int left_sum = INT_MIN; for (int i = mid; i >= left; i--) { sum += arr[i]; if (sum > left_sum) left_sum = sum; } sum = 0; int right_sum = INT_MIN; for (int i = mid + 1; i <= right; i++) { sum += arr[i]; if (sum > right_sum) right_sum = sum; } return left_sum + right_sum; } int maxSubArraySum(const vector<int>& arr, int left, int right) { if (left == right) return arr[left]; int mid = (left + right) / 2; int left_max = maxSubArraySum(arr, left, mid); int right_max = maxSubArraySum(arr, mid + 1, right); int cross_max = maxCrossingSum(arr, left, mid, right); return max({left_max, right_max, cross_max}); } int main() { vector<int> arr = {-8, -3, -6, -2, -5, -4}; cout << maxSubArraySum(arr, 0, arr.size() - 1) << endl; return 0; }
Attempts:
2 left
💡 Hint
The maximum subarray in all negative numbers is the single largest element.
✗ Incorrect
The maximum subarray sum is the largest single element, which is -2 in this array.
🔧 Debug
advancedIdentify the Bug in maxCrossingSum Function
The following maxCrossingSum function is intended to find the maximum sum of a subarray crossing the midpoint. What is the bug in this code?
DSA C++
int maxCrossingSum(const vector<int>& arr, int left, int mid, int right) { int sum = 0; int left_sum = 0; for (int i = mid; i >= left; i--) { sum += arr[i]; if (sum > left_sum) left_sum = sum; } sum = 0; int right_sum = 0; for (int i = mid + 1; i <= right; i++) { sum += arr[i]; if (sum > right_sum) right_sum = sum; } return left_sum + right_sum; }
Attempts:
2 left
💡 Hint
Consider what happens if all numbers are negative.
✗ Incorrect
Initializing left_sum and right_sum to 0 causes incorrect results when all numbers are negative because 0 is greater than any negative sum. Initializing to INT_MIN fixes this.
🧠 Conceptual
advancedTime Complexity of Divide and Conquer Maximum Subarray
What is the time complexity of the divide and conquer algorithm for finding the maximum subarray sum in an array of size n?
Attempts:
2 left
💡 Hint
Consider the recurrence relation T(n) = 2T(n/2) + O(n).
✗ Incorrect
The algorithm divides the array into two halves recursively and combines results in linear time, leading to O(n log n) complexity.
🚀 Application
expertFind Maximum Subarray Sum and Its Indices Using Divide and Conquer
Given the following C++ code that finds the maximum subarray sum using divide and conquer, what is the output printed by the program?
DSA C++
#include <iostream> #include <vector> #include <tuple> #include <algorithm> #include <climits> using namespace std; tuple<int, int, int> maxCrossingSum(const vector<int>& arr, int left, int mid, int right) { int sum = 0; int left_sum = INT_MIN; int max_left = mid; for (int i = mid; i >= left; i--) { sum += arr[i]; if (sum > left_sum) { left_sum = sum; max_left = i; } } sum = 0; int right_sum = INT_MIN; int max_right = mid + 1; for (int i = mid + 1; i <= right; i++) { sum += arr[i]; if (sum > right_sum) { right_sum = sum; max_right = i; } } return make_tuple(left_sum + right_sum, max_left, max_right); } tuple<int, int, int> maxSubArraySum(const vector<int>& arr, int left, int right) { if (left == right) return make_tuple(arr[left], left, right); int mid = (left + right) / 2; auto [left_sum, left_start, left_end] = maxSubArraySum(arr, left, mid); auto [right_sum, right_start, right_end] = maxSubArraySum(arr, mid + 1, right); auto [cross_sum, cross_start, cross_end] = maxCrossingSum(arr, left, mid, right); if (left_sum >= right_sum && left_sum >= cross_sum) return make_tuple(left_sum, left_start, left_end); else if (right_sum >= left_sum && right_sum >= cross_sum) return make_tuple(right_sum, right_start, right_end); else return make_tuple(cross_sum, cross_start, cross_end); } int main() { vector<int> arr = {13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7}; auto [max_sum, start_idx, end_idx] = maxSubArraySum(arr, 0, arr.size() - 1); cout << "Max sum: " << max_sum << ", Start index: " << start_idx << ", End index: " << end_idx << endl; return 0; }
Attempts:
2 left
💡 Hint
Trace the subarray with the largest sum and note its start and end indices.
✗ Incorrect
The maximum subarray is [18, 20, -7, 12] from index 7 to 10 with sum 43.
