Example

Thought Process

Immediately, you should come up with a brute force solution, just so you have a solution that works. Here is the brute force solution: check every subset, and take the maximum of that. Think about what that would entail. You would have to take all n subsets of length 1, n-1 subsets of length 2. There are n(n+1)/2 subsets, or O(n^2) time.

We now have an upper bound to solve this problem. Let’s figure out our goal. It’s either O(n), or O(n log n). O(n log n) happens when sorting occurs. There should be no sorting here.

Goal: O(n)

The maximum subarray equals the maximum of the greatest subarray ending at each point.

Let’s go through the array [-2,1,-3,4,-1,2,1,-5,4]

The greatest subarray ending with array[0], or -2 is -2. The greatest subarray ending with 1 is either (-2 + 1) or 1, meaning it’s 1. The greatest subarray ending in -3 is either -3 or (1 + -3). … We keep doing this and we get the array

[-2,1,-2,4,3,5,6,1,5]. The largest value is 6.

Optimize space

Note that we only needed to save two variables, the maximum ending at that point and the maximum overall. Therefore, we don’t even need to save that entire list.

Solution

def maxSubArray(nums):
current = best = nums[0]
for i in nums[1:]:
current = max(current + i, i)#Best subset ending at that point
best = max(best, current)#Best subset overall
return best