LeetCode:Sliding Window Maximum 题解 Python
这是我第一个python代码,也是我LeetCode第一道题,好开心啊!Mark一下
这道题虽然在hard分类下,但是其实是一个简单的经典的单调队列问题。
要求用线性的复杂度求一个数列的每个长度为K的子串的最大值。
题解:
维护一个单调队列, 队列中每个元素存的是(地址,值) 其中地址递增,值递减。 队首是队列,队尾是个栈。
1.顺序遍历数列
2.每次遇到一个新的数,就看看队列中队首元素到当前的位置差是不是大于K,
3.如果是,则队首元素出队 。 为什么呢,很好理解,因为第i个数字的作用范围为 [i-k+1, i+k-1]。 如果队首元素离当前位置距离超过k,则不会对当前位置的答案造成影响了
4.队尾维护一个栈,比较当前数和队尾元素的值的大小,如果队尾元素小则一直弹出栈,最后把当前的地址和数值压进队尾。
5.当前队首的值则是以当前地址为终止地址的窗口的最大值。
<span style="font-size:14px;">class Solution: # @param {integer[]} nums # @param {integer} k # @return {integer[]} def maxSlidingWindow(self, nums, k): que = [ (-1000000,1000000) ] ans = [] for i in range( len(nums) ) : while len(que)>0 and i-que[0][0] >= k : del que[0] while len(que)>0 and que[-1][1]<=nums[i] : que.pop(); que.append( (i,nums[i]) ) if i>=k-1 : ans.append(que[0][1]) return ans </span>^_^ 代码超短的。
记得第一次遇到这道题是在2012年高二的coci(克罗地亚的比赛),那天大年三十。爹妈在看春晚而我在COCI中遇到了这道提,当时不会做,第二天问了别人过掉了。 印象很深的回忆印象很深的题。