Start learning free

LESSON 227 OF 409 · PARTIAL SUMS #1

Maximum Sum Subarray II in C++ (Kadane's Algorithm, O(n) Time Complexity)

Practice O(n) Read the full explanation

( Kadane's Algorithm )


Given an input array that may contain both positive and negative integers, find the sum of continuous subarray of numbers which has the largest sum.

Example:

Input: nums = [-2, -5, 6, -2, -3, 1, 5, -6]
Output: 7
Explanation: sum([6, -2, -3, 1, 5]) = 7

Note:

Your algorithm should run in O(n) time and use O(1) extra space.


STEP 1 OF 6
    Ctrl + Enter to check

    C++ · PARTIAL SUMS #1

    Maximum Sum Subarray in C++, explained

    Problem Definition

    The problem requires finding the maximum sum of a continuous subarray within a given array of integers, which may include both positive and negative numbers.

    Input:

    • An array of integers, nums.

    Output:

    • An integer representing the maximum sum of a continuous subarray.

    Constraints:

    • The algorithm should run in O(n) time complexity.
    • The algorithm should use O(1) extra space.

    Example:

    Input: nums = [-2, -5, 6, -2, -3, 1, 5, -6]
    Output: 7
    Explanation: sum([6, -2, -3, 1, 5]) = 7

    Understanding the Problem

    The core challenge is to find the subarray with the maximum sum in linear time. This problem is significant in various fields such as finance (for maximum profit calculation) and computer science (for optimization problems).

    Potential pitfalls include misunderstanding the requirement for a continuous subarray and not accounting for negative numbers correctly.

    Approach

    To solve this problem, we can use Kadane's Algorithm, which is an efficient way to find the maximum sum subarray in O(n) time.

    Naive Solution:

    A naive solution would involve checking all possible subarrays and calculating their sums, which would result in O(n^2) time complexity. This is not optimal for large arrays.

    Optimized Solution (Kadane's Algorithm):

    Kadane's Algorithm improves upon the naive solution by maintaining a running sum of the current subarray and updating the maximum sum found so far. The key idea is to decide whether to add the current element to the existing subarray or start a new subarray.

    Algorithm

    Here is a step-by-step breakdown of Kadane's Algorithm:

    1. Initialize two variables: max_current and max_global to the first element of the array.
    2. Iterate through the array starting from the second element.
    3. For each element, update max_current to be the maximum of the current element and the sum of max_current and the current element.
    4. If max_current is greater than max_global, update max_global.
    5. Return max_global as the result.

    Code Implementation

    #include <vector>
    #include <algorithm>
    #include <iostream>
    
    int maxSubArray(const std::vector<int>& nums) {
        // Initialize max_current and max_global to the first element
        int max_current = nums[0];
        int max_global = nums[0];
    
        // Iterate through the array starting from the second element
        for (size_t i = 1; i < nums.size(); ++i) {
            // Update max_current to be the maximum of the current element and the sum of max_current and the current element
            max_current = std::max(nums[i], max_current + nums[i]);
            // Update max_global if max_current is greater
            if (max_current > max_global) {
                max_global = max_current;
            }
        }
    
        // Return the maximum sum found
        return max_global;
    }
    
    int main() {
        std::vector<int> nums = {-2, -5, 6, -2, -3, 1, 5, -6};
        std::cout << "Maximum sum of continuous subarray: " << maxSubArray(nums) << std::endl;
        return 0;
    }
    

    Complexity Analysis

    The time complexity of Kadane's Algorithm is O(n) because it involves a single pass through the array. The space complexity is O(1) as it uses a constant amount of extra space.

    Edge Cases

    Potential edge cases include:

    • All negative numbers: The algorithm should return the maximum single element.
    • Single element array: The algorithm should return that element.

    Example edge cases:

    Input: nums = [-1, -2, -3]
    Output: -1
    
    Input: nums = [5]
    Output: 5

    Testing

    To test the solution comprehensively, consider the following test cases:

    • Array with both positive and negative numbers.
    • Array with all positive numbers.
    • Array with all negative numbers.
    • Single element array.

    Testing frameworks such as Google Test can be used for automated testing.

    Thinking and Problem-Solving Tips

    When approaching such problems, consider the following tips:

    • Break down the problem into smaller parts.
    • Think about edge cases and how to handle them.
    • Practice similar problems to improve problem-solving skills.

    Conclusion

    Understanding and solving the maximum sum subarray problem using Kadane's Algorithm is crucial for optimizing performance in various applications. Practice and familiarity with such algorithms can significantly enhance problem-solving skills.

    Additional Resources

    For further reading and practice, consider the following resources:

    Keep going with C++About 340 step-by-step lessons, from your first line of code to coding interviews. Free to start.
    Start learning free