【经典题目】绝对差不超过限制的最长连续子数组——滑动窗+单调栈

183周竞赛题目 难度M

【经典题目】绝对差不超过限制的最长连续子数组——滑动窗+单调栈_第1张图片

也是一道将动态规划问题转换为单调栈的问题。借助这道题目我们希望得到一些启示,什么样的题目是适合考虑单调栈。

首先单调栈的核心是维护了一个递增或递减的队列。也就是很容易得到在一定范围的最大值的坐标。
对于这道题目,最大的最大值的差无疑就是要求在一定范围内的最大值和最小值之差。因此我们需要一个队列去维护在一定范围内的最大值和最小值。

对于一定的范围这个限制,结合题目中连续子数组这一要求,应该想到使用滑动窗。

class Solution:
    def longestSubarray(self, nums: List[int], limit: int) -> int:
        n = len(nums)
        begin = 0
        end = 0
        ans = 0
        min_ = collections.deque()
        max_ = collections.deque()
        def queue_min(i, l):
            while l and nums[i]<nums[l[-1]]:
                l.pop()
            l.append(i)
        def queue_max(i, l):
        	# !!!还是这里需要注意,队伍里存储的是坐标,需要于对应坐标的数值进行比较
            while l and nums[i]>nums[l[-1]]:
                l.pop()
            l.append(i)

        for i in range(n):
            queue_min(i, min_)
            queue_max(i, max_)
            while nums[max_[0]]-nums[min_[0]]>limit:
                begin += 1
                if max_[0]<begin:
                    max_.popleft()
                if min_[0]<begin:
                    min_.popleft()

            ans = max(ans, i-begin+1)
        return ans
  

你可能感兴趣的:(leetcode经典题目)