53_Maximum Subarray-最大子陣列

金字塔下的蜗牛發表於2024-05-09

問題描述

Given an integer array nums, find the subarray with the largest sum, and return its sum.

給定一個陣列nums, 找到一個子陣列。使它的和最大,返回子陣列

例子

Input: nums = [-2,1,-3,4,-1,2,1,-5,4]
Output: 6
Explanation: 子陣列 [4,-1,2,1] 有最大的和6.

基本思想

這是一個動態規劃的問題。解題思路類比於最大遞增序列。如下:

  • 構建陣列dp,其大小為nums的長度。其中dp[i] 表示 以 nums[i] 為結尾的子陣列的最大的和
  • 則dp[i]的大小取決於如下兩個變數 dp[i-1]+nums[i] , nums[i]
    • 如果 dp[i-1]+nums[i] < nums[i], 則 dp[i] = dp[i-1]+nums[i] 表示nums[i]加入以nums[i-1]為結尾擁有最大和的子陣列中
    • 如果 dp[i-1]+nums[i] >= nums[i], 則dp[i] = nums[i] 表示 以nums[i]結尾的最大和的子陣列只有一個元素

時間複雜度 O(n),空間複雜度O(n)

程式碼

C++

   int maxSubArray(vector<int>& nums) {
      if (nums.size()<=0)  return 0;
      int size = nums.size();
      vector<int> dp(size, 0);
      dp[0] = nums[0];
      int maxSum = dp[0];
      for(int i=1;i<size;++i) {
        dp[i] = max(nums[i], nums[i]+dp[i-1]);
        maxSum = max(dp[i], maxSum);
      }
      return maxSum;
    }

python

    def maxSubArray(self, nums: List[int]) -> int:
        if len(nums)<=0: return 0
        dp = [0] * len(nums)
        dp[0] = nums[0]
        for i in range(1,len(nums)):
            dp[i] = max(nums[i], nums[i]+dp[i-1])
        return max(dp)   

相關文章