
与えられた配列のうち、連続した部分配列の和の最大値を求める問題を考える(最大部分配列問題、最大部分列和問題)。
愚直に解くと二重ループだが、O(n^2)となり遅い。
DPの一種であるKadane’s algorithmを使うとO(n)で高速に解けるようになる。
試しにLeetCodeの53. Maximum Subarrayを解いてみる。
Just a moment...
愚直解:O(n^2)
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        n = len(nums)
        ans = -1e5
        for i in range(n):
            for j in range(n):
                if j < i:
                    continue
                    
                temp = nums[i:j+1]
                ans = max(ans, sum(temp))
        
        return ansKadane’s algorithm O(n)
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        best = -1e9
        cur = 0
        
        for i in range(len(nums)):
            cur = max(nums[i], nums[i] + cur)
            best = max(best, cur)
        
        return best参考
Just a moment...

Maximum subarray problem - Wikipedia

Kadane’s Algorithm — (Dynamic Programming) — How and Why does it Work?
If you are here, then chances are that you were trying to solve the “Maximum Subarray Problem” and came across Kadane’s ...
 
  
  
  
  

コメント