今天的好难喔
看安杀才知道 multiset跟monotonic deque这两个东西==
听都没听过
直接照抄答案
用两个monotonic deque来维护最大值和最小值。
increaseDeque[0] = 最小值
decreaseDeque[0] = 最大值
新元素加入时,对于最大值deque,不用保留比新元素num[j]小的值,因为这些值在j之前
,当子阵列跨过j时,这些值不会影响后面的答案,因此全部pop出去再append新元素。
相反地,对于最小值deque,不用保留比新元素大的值,先把比新元素大的值全部pop出去
再append,这样才能维持这两个deque的单调递增/递减。
当最大值-最小值不符合条件时,需要移动left pointer。移动过程中,如果遇到当前的
最大值或最小值,则要将其从左侧移出。
def longestSubarray(self, nums: List[int], limit: int) -> int:
ans, l = 0, 0
dec = collections.deque() # for maximum
inc = collections.deque() # for minimum
for r, num in enumerate(nums):
while dec and dec[-1] < num:
dec.pop()
dec.append(num)
while inc and inc[-1] > num:
inc.pop()
inc.append(num)
# dec[0] == maximum in subarray
# inc[0] == minimum in subarray
while dec[0]-inc[0] > limit:
if dec[0] == nums[l]:
dec.popleft()
if inc[0] == nums[l]:
inc.popleft()
l += 1
ans = max(ans, r-l+1)
return ans