LC 2945. 找到最大非递减数组的长度
https://leetcode.cn/problems/find-maximum-non-decreasing-array-length/
跟着 题解 差不多看懂了整个过程,好像得到两个重要特性:
- `f[i]` 是单调递增的
- `s[i] + last[i]` 这个也是单调递增
- 对于i来说,选择的就是最大的j, `s[i] >= s[j] + last[j]`.
所以可以使用单调递增的队列,时间复杂度就是在O(n).
class Solution:
def findMaximumLength(self, nums: List[int]) -> int:
n = len(nums)
s = [0] * (n + 1)
for i in range(n):
s[i + 1] = s[i] + nums[i]
f = [0] * (n + 1)
last = [0] * (n + 1)
from collections import deque
q = deque([0])
for i in range(1, n + 1):
while len(q) > 1 and s[q[1]] + last[q[1]] <= s[i]:
q.popleft()
f[i] = f[q[0]] + 1
last[i] = s[i] - s[q[0]]
while q and s[q[-1]] + last[q[-1]] >= s[i] + last[i]:
q.pop()
q.append(i)
return f[-1]