LeetCode:Sliding Window Maximum 题解 Python

来源:互联网 发布:手机mac地址修改器 编辑:程序博客网 时间:2024/06/11 01:08

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中遇到了这道提,当时不会做,第二天问了别人过掉了。 印象很深的回忆印象很深的题。 

0 0
原创粉丝点击