题目:原题链接(困难)
标签:动态规划、贪心算法、有序映射
解法 | 时间复杂度 | 空间复杂度 | 执行用时 |
---|---|---|---|
Ans 1 (Python) | O ( N l o g K ) O(NlogK) O(NlogK) | O ( N ) O(N) O(N) | 264ms (94.74%) |
Ans 2 (Python) | |||
Ans 3 (Python) |
解法一:
import collections
from typing import List
from sortedcontainers import SortedList
class Solution:
def constrainedSubsetSum(self, nums: List[int], k: int) -> int:
# 均为负数的情况
max_val = max(nums)
if max_val <= 0:
return max_val
lst = [0]
window1 = collections.deque()
window2 = SortedList()
for i2, num2 in enumerate(nums):
if num2 >= 0:
if len(window1) != 0:
if len(window1) == k:
lst.append(window2[-1][0])
window1.clear()
window2.clear()
lst.append(num2)
else:
lst[-1] += num2
else:
if len(window1) < k:
window1.append((num2, i2))
window2.add((num2, i2))
else:
v = window2[-1][0] + num2
num1, i1 = window1.popleft()
window2.remove((num1, i1))
window1.append((v, i2))
window2.add((v, i2))
else:
if len(window1) != 0:
lst.append(window2[-1][0])
ans = 0
total = 0
for num in lst:
total = max(0, total + num)
ans = max(ans, total)
return ans