leetcode-186周赛-5180-带限制的子序列和

题目描述:

 

 

 

 方法一:动态规划 O(n)

class Solution:
    def constrainedSubsetSum(self, nums, k: int):
        dp = [0]*len(nums)
        dp[0] = nums[0]
        arr = [(nums[0],0)]
        for i in range(1,len(nums)):
            M = arr[0][0]

            if M>=0:dp[i] = M+nums[i]
            else:dp[i] = nums[i]
            while arr and dp[i]>=arr[-1][0]:
                arr.pop()
            arr.append((dp[i],i))
            while arr[0][1]<(i-k+1):
                arr.pop(0)
        return max(dp)

方法二:堆

class Solution:
    def constrainedSubsetSum(self, nums: List[int], k: int) -> int:
        hq,s=[],-100000
        heapq.heappush(hq,(0,len(nums)))
        for i,x in enumerate(nums):
            while hq[0][1]<i-k: heapq.heappop(hq)
            t=-hq[0][0]+x
            s=max(s,t)
            heapq.heappush(hq,(-t,i))
        return s

 

posted @ 2020-04-26 17:55  oldby  阅读(128)  评论(0编辑  收藏  举报