版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhou_pp/article/details/85161725
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)