单调队列(算法)

单调队列是求解区间最大值或最小值的算法

正向遍历时,是先入后出 , 队列中的下标是按照从左往右递增 , 由于正向遍历,当前下标比之前下标大,所以与末尾值比较 , 并且入列时添加在末尾 , 出列弹出队首

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
   		# 求解区间最大值
        q = deque([])
        ans = []
        for i , num in enumerate(nums):
        	# 入列
            while q and nums[q[-1]] <= num:
                q.pop()
            q.append(i)
            # 超出区间 出列
            if i - q[0] + 1 > k:
                q.popleft()
            if i >= k - 1:
                ans.append(nums[q[0]])
        return ans

反向便利时,是先出后入,队列中的下标也是按照从左往右递增 ,由于反向遍历 , 当前下标比之前下标小,所以与队列首位比较 , 并且入列时添加在首位 , 出列弹出队尾

class Solution:
    def minimumCoins(self, prices: List[int]) -> int:
        n = len(prices)
        q = deque([(n+1,0)])

        for i in range(n,0,-1):
            while q and q[-1][0] > 2 * i + 1:
                q.pop()
            f = q[-1][1] + prices[i-1]
            while q and q[0][1] >= f:
                q.popleft()
            q.appendleft((i,f))
        return q[0][1]

你可能感兴趣的:(算法)