Leetcode239. Sliding Window Maximum-双端队列

Leetcode239. Sliding Window Maximum

Leetcode239. Sliding Window Maximum

题目

题目链接

思路

1.暴力循环,对每个窗口内比较最大值
2.使用双端队列,从前到后,将数值压入队列中,将队列中比它小的值都弹出

复杂度

暴力循环的时间复杂度是 O ( n ∗ k ) O(n*k) O(nk)
使用栈:
时间复杂度,从前到后遍历一次即完成操作,因此为 O ( n ) O(n) O(n)
空间复杂度,新建了队列,最坏情况是满队列, O ( n ) O(n) O(n)

代码

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        begin = 0
        q = collections.deque([], maxlen=k)
        output = []
        for end in range(len(nums)):
            # 保证最左侧的元素是队列中的最大数(下标)
            while q and nums[end] > nums[q[-1]]:
                q.pop()

            q.append(end)
            
			# 只保留在当前窗口中的元素下标
            while end - begin + 1 > k:
                begin +=1
                if q[0] < begin:
                    q.popleft()
            
            if end - begin + 1 == k:
                output.append(nums[q[0]])
                
        return output

猜你喜欢

转载自blog.csdn.net/qq_17065591/article/details/115419841
今日推荐