# LC 53. Maximum Subarray ### [Problem link](https://leetcode.com/problems/maximum-subarray/) ###### tags: `leedcode` `python` `c++` `medium` `Greedy` `DP` Given an integer array <code>nums</code>, find the subarray with the largest sum, and return its sum. **Example 1:** ``` Input: nums = [-2,1,-3,4,-1,2,1,-5,4] Output: 6 Explanation: The subarray [4,-1,2,1] has the largest sum 6. ``` **Example 2:** ``` Input: nums = [1] Output: 1 Explanation: The subarray [1] has the largest sum 1. ``` **Example 3:** ``` Input: nums = [5,4,-1,7,8] Output: 23 Explanation: The subarray [5,4,-1,7,8] has the largest sum 23. ``` **Constraints:** - <code>1 <= nums.length <= 10<sup>5</sup></code> - <code>-10<sup>4</sup> <= nums[i] <= 10<sup>4</sup></code> **Follow up:** If you have figured out the <code>O(n)</code> solution, try coding another solution using the **divide and conquer** approach, which is more subtle. ## Solution 1 - DP #### Python ```python= class Solution: def maxSubArray(self, nums: List[int]) -> int: n = len(nums) res = nums[0] dp = [0] * (n + 1) dp[0] = nums[0] # dp[i]: 以nums[i]為結尾的Maximum Subarray和 for i in range(1, n): dp[i] = max(nums[i], dp[i - 1] + nums[i]) res = max(res, dp[i]) return res ``` #### C++ ```cpp= class Solution { public: int maxSubArray(vector<int>& nums) { vector<int> dp(nums.size(), 0); dp[0] = nums[0]; int res = nums[0]; for (int i = 1; i < nums.size(); i++) { int curSum = dp[i - 1] + nums[i]; dp[i] = max(curSum, nums[i]); res = max(res, dp[i]); } return res; } }; ``` ## Solution 2 - DP (Space Complexity: O(n)) ```cpp= class Solution { public: int maxSubArray(vector<int>& nums) { int res = nums[0]; int curMax = nums[0]; for (int i = 1; i < nums.size(); i++) { curMax = max(curMax + nums[i], nums[i]); res = max(res, curMax); } return res; } }; ``` ## Solution 3 - Greedy #### Python ```python= class Solution: def maxSubArray(self, nums: List[int]) -> int: res = float("-inf") sum_ = 0 for idx, num in enumerate(nums): sum_ += num if sum_ > res: res = sum_ if sum_ < 0: sum_ = 0 return res ``` #### C++ ```cpp= class Solution { public: int maxSubArray(vector<int>& nums) { int res = INT_MIN; int cnt = 0; for (int i = 0; i < nums.size(); i++) { cnt += nums[i]; if (cnt > res) { res = cnt; } if (cnt < 0) { cnt = 0; } } return res; } }; ``` >### Complexity >| | Time Complexity | Space Complexity | >| ----------- | --------------- | ---------------- | >| Solution 1 | O(n) | O(n) | >| Solution 2 | O(n) | O(1) | >| Solution 3 | O(n) | O(1) | ## Note sol2: nums = [-2,1,-3,4,-1,2,1,-5,4] curMax = -2, num = 1, curMax = 1 num = -3, curMax = -2 num = 4, curMax = 4 num = -1, curMax = 3 num = 2, curMax = 5 num = 1, curMax = 6 num = -5, curMax = 1 num = 4, curMax = 5