# Maximum Subarray

The Maximum Subarray problem is a classic example in computer science, used to demonstrate the application of dynamic programming and divide-and-conquer strategies. The problem can be simply stated as follows: given an array of integers, find the contiguous subarray (containing at least one number) which has the largest sum and return that sum.

### Understanding the Problem with First Principles

First principles thinking involves breaking down complex problems into basic elements and then reassembling them from the ground up. Let's apply this approach to understand the Maximum Subarray problem.

1. Array Concept: An array is a fundamental data structure that represents a collection of elements (values or variables), each identified by at least one array index or key. In the context of the Maximum Subarray problem, we consider an array of integers where each element represents a value that can be positive, negative, or zero.

2. Subarray Definition: A subarray is a contiguous part of an array. It means that the elements of the subarray appear in unbroken sequence in the original array. For instance, in the array [1, -2, 3, 4], [1, -2, 3] and [3, 4] are subarrays, but [1, 3] is not because the elements are not contiguous.

3. Summation and Comparison: The problem requires us to find a subarray such that its elements' sum is maximized. This involves calculating the sum of elements for all possible subarrays and then comparing these sums to identify the maximum one.

### Solving the Problem

The Maximum Subarray problem can be solved using various methods, but two prominent approaches are:

1. Kadane’s Algorithm (Dynamic Programming): This is the most efficient method for solving the Maximum Subarray problem. It uses the concept of dynamic programming to solve the problem in linear time, $O(n)$, where $n$ is the number of elements in the array.

• Principle: Kadane’s algorithm iterates through the array and at each position, it decides whether to add the current element to the existing subarray or start a new subarray from the current position. This decision is based on which option would produce a larger sum.

• Implementation: It maintains two variables - one for the maximum sum found so far and another for the current subarray sum. As it iterates through the array, it updates these variables according to the logic described above.

2. Divide and Conquer: This method involves breaking down the array into smaller subarrays, solving the problem for these subarrays, and then combining the results to find the maximum sum subarray of the original array.

• Principle: The divide and conquer approach divides the array into two halves, finds the maximum subarray sum in each half, and also finds the maximum subarray sum that crosses the midpoint. The largest of these three sums is the solution to the problem.

• Implementation: This method is recursive, where the base case is when the array has only one element. For larger arrays, it divides the array into halves, recursively solves for each half, and also finds the maximum cross-midpoint sum before combining these to find the overall maximum.

### Example

Consider the array [-2, 1, -3, 4, -1, 2, 1, -5, 4]. Using Kadane’s algorithm:

• Starting with the first element, -2, the maximum sum so far is -2.
• Moving to the second element, 1, starting a new subarray with 1 is better than adding it to -2. So, the maximum sum so far becomes 1.
• As we proceed, we keep updating the maximum sum and the current sum according to the logic of Kadane’s algorithm.
• By the end, we find that the maximum sum subarray is [4, -1, 2, 1] with a sum of 6.

Kadane's algorithm is widely used due to its simplicity and efficiency. It beautifully demonstrates how a complex problem can be solved efficiently by breaking it down into simpler steps and applying logical decision-making at each step.