Leetcode 150 — Kadane’s Algorithm 解題心得
Leetcode 150 — Kadane’s Algorithm 解題心得¶
基本題型是給定一個list,要去找list中subarray的最大值,subarray的定義是list中的連續片段
另一種變形體是一樣找最大subarray,但是可以頭尾互接(一樣需要遵守subarray的連續)
這種題型基本上,因為是要找最大值,所以我們只需要一個pointer,從起頭走到尾吧,並且持續加總,加總過程去比對當下值跟遇到的最大值(這樣可以確保把最大值保存),再來是如果當下的加總是小於0,表示該pointer以前的加總會是負,直接不用看,等於當下值即可,程式碼如下
class Solution: def maxSubArray(self, nums: List[int]) -> int: res, cur = float('-inf'),0 r,N = 0,len(nums) while r<N: if cur<=0: cur=nums[r] else: cur+=nums[r] r+=1 res = max(res,cur) return res
而可以迴圈的狀況,可以想像成我們是在找中間的最小值,用list sum去扣除最小的可能值,就表示抓到可以的最大值
程式碼如下:
class Solution: def maxSubarraySumCircular(self, nums: List[int]) -> int: nor_res,N = float("-inf"),len(nums) l,cur =0,0 while l<N: if cur<0: cur=nums[l] else: cur+=nums[l] l+=1 nor_res = max(nor_res, cur) if N>=3: l,cur=1,0 cur_min = float("inf") while l<N-1: if cur>=0: cur = nums[l] else: cur+=nums[l] l+=1 cur_min = min(cur_min, cur) nor_res = max(nor_res, sum(nums)-cur_min) return nor_res
Comments
Loading comments…
Leave a Comment