LeetCode:Sliding Window Maximum 题解 Python

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值