3. 数组和窗口

Description

给定一个整型数组arr和一个大小为w的窗口,窗口从数组最左边滑动到最右边,每次向右滑动一个位置,求出每一次滑动时窗口内最大元素的和。

Input

输入的第一行为数组,每一个元素使用空格隔开;第二行为窗口大小。

Output

输出一个值。

Sample Input 1 

4 3 5 4 3 3 6 7

3

Sample Output 1

32

from collections import deque
class Solution:
    """
    @param: nums: A list of integers
    @param: k: An integer
    @return: The maximum number inside the window at each moving
    """
    def maxSlidingWindow(self, nums, k):
        sd = 0
        # write your code here
        #特殊情况,k=1,则每个都最大
        if k == 1:
            for g in range(len(nums)):
                sd += int(nums[g])
            return nums
        #新建一个双端队列qmax,初始值为0
        #res存放每次移动的最大结果
        qmax = deque([])
        qmax.append(0)
        res = []


        for x,y in enumerate(nums[1:],1):
            """
            x,y表示当前的下标和nums值;
            判断qmax队尾存储的下标j,
            如果nums[j] > y,直接把下标x放进qmax队尾中;
            如果nums[j] <=y ,则一直从qmax的队尾弹出直到某个下标在qmax中对应的值大于y,
            此时把x放在qmax的队尾中.
            """
            if nums[qmax[-1]] <=y:
                for i in range(len(qmax)-1,-1,-1):
                    if nums[qmax[i]] > y:
                        break
                    else:
                        qmax.pop()
            qmax.append(x)
            #当qmax存在过期数据,即不在移动k范围内的,将其移除出双端队列
            ns=int(k)
            if qmax[0] <= x-ns:
                qmax.popleft()
            #将每次移动窗口的最大值存储到res中
            if x >=ns-1:
                res.append(nums[qmax[0]])
        for g in range(len(res)):
             sd+=int(res[g])
        return sd

if __name__ == "__main__":
   s = Solution()
   A=[]
   newValue=input()
   se=newValue.replace(' ','')
   A.extend(se)
   num=input()
   suma=s.maxSlidingWindow(A,num)
   print(suma)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值