1. 程式人生 > 其它 >leetcode_動態規劃_53_最大子陣列和

leetcode_動態規劃_53_最大子陣列和

題目描述

解題過程

暴力滑窗

本菜雞看題目第一眼就暗喜,這還不簡單嘛,直接滑窗滑過去,記錄下最大的窗就可以了嗎。視窗左節點在滿足下面兩種條件的情況下,會向後移動。

  1. 本次滑窗內的連續陣列和小於等於零
  2. 本次滑窗的右節點移動到末尾
    直接手擼程式碼如下,輕鬆通過三個測試案例
nums = [-2,1,-3,4,-1,2,1,-5,4]
left,right = 0,0
temp = nums[0:1]
res = nums[0]
# res = 1
N = len(nums)
while left <= N :
    if right >= N:
        left += 1
        right = left
        # print('第一個')
    if res < 0:
        left += 1
        right = left
        # print('第二個')
    temp = nums[left : right + 1]
    if temp == []:
        break
    res = max(res,sum(temp))
    right += 1
print(res)

點選提交,沒想到後臺直接給了個長度1w的陣列讓跑,直接顯示測試超時。還是乖乖看題解去吧

題解—動態規劃

不得不說,真是妙的很。思路很清晰,找到了狀態轉移方程。首先定義f(i)為以i結尾的最大連續陣列和。i遍歷一遍得到f(i)組成的陣列,再從中找到最大值即可。其中,f(i)轉移的方程為f(i)=max{f(i-1)+nums(i),nums(i)}. (白手起家也不要接之前的爛攤子)

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        N = len(nums)
        temp = [nums[0],]
        for i in range(1,N):
            temp.append(max(temp[i - 1] + nums[i],nums[i]))

        return max(temp)