面试59题:
题目:队列的最大值。
题目一:滑动窗口的最大值。
给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如:如果输入数组为[2,3,4,2,6,2,5,1]及滑动窗口大小为3,那么一共存在6个滑动窗口,它们的最大值分别为[4,4,6,6,6,5]
解题方法:直接上Python的方法,求每段滑动窗口的最大值。
方法一:时间复杂度为O(n*k),k为窗口的大小
# -*- coding:utf-8 -*- class Solution: def maxInWindows(self, num, size): if not num or not size: return [] res = [] for i in range(len(num) - size + 1): res.append(max(num[i : i+size])) return res if __name__=="__main__": print(Solution().maxInWindows([2,3,4,2,6,2,5,1],3))
还可以利用两端开口的队列求解
时间复杂度为O(n)
# -*- coding:utf-8 -*- class Solution: def maxInWindows(self, num, size): # write code here if not num or size<=0: return [] res = [] if len(num)>=size and size>=1: deque=[] for i in range(size): while deque and num[i]>=num[deque[-1]]: deque.pop() deque.append(i) for i in range(size,len(num)): res.append(num[deque[0]]) while (deque and num[i]>=num[deque[-1]]): deque.pop() if deque and deque[0]<=i-size: deque.pop(0) deque.append(i) res.append(num[deque[0]]) return res
题目二:求队列的最大值。
请定义一个队列并实现max函数得到队列的最大值,要求max函数、push_back和pop_front的时间复杂度都是O(1)