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.
Time:O(N)
Space:O(N)
//prefix
public class Solution { /** * @param nums: A list of integers * @return: A integer indicate the sum of max subarray */ public int maxSubArray(int[] nums) { // write your code here if (nums == null || nums.length == 0) { return 0; } int max = Integer.MIN_VALUE, min = 0, sum = 0; for (int i = 0; i < nums.length; i++) { sum += nums[i]; max = Math.max(max, sum - min); min = Math.min(min, sum); } return max; } }
//dp
1 class Solution: 2 def maxSubArray(self, nums: List[int]) -> int: 3 if nums is None or len(nums) == 0: 4 return 5 6 sum_arr = [0] * len(nums) 7 sum_arr[0] = nums[0] 8 max_res = nums[0] 9 for i in range(1, len(nums)): 10 if sum_arr[i - 1] > 0: 11 sum_arr[i] = nums[i] + sum_arr[i - 1] 12 else: 13 sum_arr[i] = nums[i] 14 max_res = max(max_res, sum_arr[i]) 15 return max_res
class Solution { public int maxSubArray(int[] nums) { if (nums == null || nums.length == 0) { return 0; } int sum = nums[0], res = sum; for (int i = 1; i < nums.length; i++) { // add sum if sum > 0 sum = Math.max(nums[i], sum + nums[i]); res = Math.max(res, sum); } return res; } }