leetcode_動態規劃_53_最大子陣列和
阿新 • • 發佈:2022-03-29
題目描述
解題過程
暴力滑窗
本菜雞看題目第一眼就暗喜,這還不簡單嘛,直接滑窗滑過去,記錄下最大的窗就可以了嗎。視窗左節點在滿足下面兩種條件的情況下,會向後移動。
- 本次滑窗內的連續陣列和小於等於零
- 本次滑窗的右節點移動到末尾
直接手擼程式碼如下,輕鬆通過三個測試案例
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)