1. 解题思路
这一题我的思路上是一个滑动窗口的思路。
策略上来说的话就是尽可能多取,然后每次取尽可能取最大的数。因此,我们首先将所有的数字按照limit进行排序,然后对于相同的limit,按照val进行倒序排序,然后依次进行选取。
每一次选取,如果能选就直接选,然后更新当前active的数的状态即可。
2. 代码实现
给出python代码实现如下:
class Solution:
def maxTotal(self, value: List[int], limit: List[int]) -> int:
arr = sorted([(val, lmt) for val, lmt in zip(value, limit)], key=lambda x: (x[1], -x[0]))
status = [0 for _ in arr]
i, j, n = 0, 0, len(arr)
active, ans = 0, 0
while j < n:
val, lmt = arr[j]
if active < lmt:
status[j] = 1
ans += val
active += 1
if active == lmt:
while j < n and arr[j][1] == active:
j += 1
else:
j += 1
while i < j and arr[i][1] <= active:
active -= status[i]
i += 1
return ans
提交代码评测得到:耗时407ms,占用内存48.02MB。

1万+

被折叠的 条评论
为什么被折叠?



