53. Maximum Subarray

题目描述

给一个array, 找一个连续的子数组,它的sum是最大的,返回sum值。

我的解法——求前n项和+DP

  • 遍历两遍数组
  • n的复杂度。
  • 结果:beat 37.26%
class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        sum = 0
        length = len(nums)
        if(length == 1):
            return nums[0]
        
        for i in range(1,length):
            nums[i] += nums[i - 1]
            
        smallest = 0
        res = nums[0]
        for i in range(length):
            last = nums[i]  # 注意这里,后面的smallest要和被修改之前的nums[i]进行比较!!!!
            nums[i] = nums[i] - smallest
            if(last < smallest):
                smallest = last
            if(nums[i] > res):  #保存结果
                res = nums[i]

        return res

其他解法——DP

  • 令sum[i]表示从i开始的最大子串和,则有递推公式:sum[i] = max{A[i], A[i] + sum[i+1]}
  • n的时间复杂度
int maxSubArray(int A[], int n) {
  int sum = A[n - 1];
  int maxSum = sum;

  for (int i = n - 2; i >= 0; i--) {
    sum = max(A[i], sum + A[i]);
    maxSum = max(maxSum, sum);
  }

  return maxSum;
}