Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.
Example:
Input: [-2,1,-3,4,-1,2,1,-5,4],
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.
The first method is DP. max_sum[i] = max_sum[i-1] + 1 if sum > 0 else array[i].
The second method is Greedy algorithm. max_sum[i] = array[i]- the minimum sum of the first i-1 elements.
- DP
class Solution:
def maxSubArray(self, nums: 'List[int]') -> 'int':
if not nums:
return 0
if len(nums) == 1:
return nums[0]
sum_ = nums[0]
max_ = nums[0]
for i in range(1,len(nums)):
if sum_ > 0:
sum_ += nums[i]
else:
sum_ = nums[i]
max_ = max(max_, sum_)
return max_
- Greedy algorithm
class Solution:
def maxSubArray(self, nums: 'List[int]') -> 'int':
if not nums:
return 0
min_sum = 0
max_sum = 0
sum_ = 0
for i in range(len(nums)):
sum_ += nums[i]
if i == 0:
max_sum = sum_
min_sum = sum_
else:
max_sum = max(max(sum_-min_sum, max_sum), sum_)
min_sum = min(min_sum, sum_)
return max_sum