###### tags: `Leetcode` `easy` `dynamic programming` `greedy` `python` `c++`
# 53. Maximum Subarray
## [題目來源:] https://leetcode.com/problems/maximum-subarray/
## 題目:
Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.
**A subarray is a contiguous part of an array.**
**Example 1:**
```
Input: nums = [-2,1,-3,4,-1,2,1,-5,4]
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.
```
**Example 2:**
```
Input: nums = [1]
Output: 1
```
**Example 3:**
```
Input: nums = [5,4,-1,7,8]
Output: 23
```
## 解題想法:
* 進階題目:[152. Maximum Product Subarray](/RSZktS2hQnCK2uwNKXJZFA)
* 此題為求連續累加最大
* 若前一個總合為負,則忽略了
* 若為正,表是加上現在(正or負都不管)還有變大的希望
## Python:
``` python=
class Solution(object):
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
#dp只考慮前面:
#若前面總合為負:放棄
#為正:加上當前
res=nums[0]
for i in range(1,len(nums)):
if nums[i-1]>0:
nums[i]+=nums[i-1]
res=max(res,nums[i])
return res
if __name__ == '__main__':
nums = [5,4,-1,7,8]
result = Solution()
result = result.maxSubArray(nums)
print(result)
'''
#greedy
cur_max=nums[0]
total_max=nums[0]
for i in range(1,len(nums)):
cur_max=max(nums[i],cur_max+nums[i])
total_max=max(total_max,cur_max)
return total_max
'''
```
## C++:
``` cpp=
#include<iostream>
#include<vector>
using namespace std;
//dp
class Solution{
public :
int maxSubArray(vector<int>& nums){
int res=nums[0];
for (int pos=1; pos<nums.size(); pos++){
if (nums[pos-1]>0)
nums[pos]+=nums[pos-1];
res=max(res,nums[pos]);
}
return res;
}
};
//greedy
class Solution2{
public:
int maxSubArray(vector<int>& nums){
int total_max=nums[0];
int cur_max=nums[0];
for(int i=1; i<nums.size(); i++){
cur_max=max(cur_max+nums[i],nums[i]);
total_max=max(total_max,cur_max);
}
return total_max;
}
};
int main(){
Solution res;
vector<int> nums={-2,1,-3,4,-1,2,1,-5,4};
int ans=res.maxSubArray(nums);
cout<<ans<<endl;
Solution2 res2;
vector<int> nums2={-2,1,-3,4,-1,2,1,-5,4};
int ans2=res2.maxSubArray(nums2);
cout<<ans2<<endl;
return 0;
}
```