---
tags: data_structure_python
---
# Maximum Subarray <img src="https://img.shields.io/badge/-easy-brightgreen">
Given an integer array ```nums```, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.
<ins>**Example:**</ins>
>Input: [-2,1,-3,4,-1,2,1,-5,4],
>Output: 6
>Explanation: [4,-1,2,1] has the largest sum = 6.
**Follow up:**
If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.
## Solution
### Solution 1: Naive approach
```python=
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
# o(n^2)
n = len(nums)
maxi = -2**31
for i in range(n):
for j in range(i, n):
tmp = sum(nums[i:j+1])
if tmp > maxi:
maxi = tmp
return maxi
```
### Solution 2: Divide and Conquer
```python=
class Solution:
def __maxSubArray(self, nums, l, r):
# Divide and Conquer.
# o(nlog(n))
if l == r:
return nums[l]
else:
mid = l + (r - l)//2
leftMax= -2**31
accu = 0
for i in range(mid, l-1, -1):
accu += nums[i]
if accu > leftMax:
leftMax = accu
rightMax= -2**31
accu = 0
for i in range(mid+1, r+1):
accu += nums[i]
if accu > rightMax:
rightMax = accu
maxLeftRight = max(self.__maxSubArray(nums, l, mid),
self.__maxSubArray(nums, mid+1, r))
return max(maxLeftRight, leftMax + rightMax)
def maxSubArray(self, nums: List[int]) -> int:
return self.__maxSubArray(nums, 0, len(nums)-1)
```
### Solution 3: Kadane's Algorithm
```python=
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
# Kadane's Algorithm o(n).
globalMax = nums[0]
localMax = globalMax
for i in nums[1:]:
localMax = max(localMax+i,i)
globalMax = max(localMax, globalMax)
return globalMax
```