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

Posted 真不知道叫啥好

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于leetcode-186周赛-5180-带限制的子序列和的主要内容,如果未能解决你的问题,请参考以下文章