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()
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存在過期資料,即不在移動k範圍內的,將其移除出雙端佇列
ns=int(k)
if qmax[0] <= x-ns:
qmax.popleft()
#將每次移動視窗的最大值儲存到res中
if x >=ns-1:
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)
演算法 陣列和視窗 陣列
給定乙個整型陣列arr和乙個大小為w的視窗,視窗從陣列最左邊滑動到最右邊,每次向右滑動乙個位置,求出每一次滑動時視窗內最大元素的和。輸入第一行為用例個數,每個測試用例輸入的第一行為陣列,每乙個元素使用空格隔開 第二行為視窗大小。輸出每個測試用例結果。14 3 5 4 3 3 6 7 3 陣列與視窗 ...
陣列 滑動視窗
滑動視窗大多用於處理連續子陣列問題,然後得到相應的長度。例題 長度最小的子陣列 給定乙個含有 n 個正整數的陣列和乙個正整數 s 找出該陣列中滿足其和 s 的長度最小的連續子陣列。如果不存在符合條件的連續子陣列,返回 0。思路 使用滑動視窗i在左邊,j在右邊,明確意義 i,j 為滑動視窗 閉區間 如...
陣列 滑動視窗
leetcode 209.長度最小的子陣列 給定乙個含有 n 個正整數的陣列和乙個正整數 s 找出該陣列中滿足其和 s 的長度最小的 連續 子陣列,並返回其長度。如果不存在符合條件的子陣列,返回 0。示例 輸入 s 7,nums 2,3,1,2,4,3 輸出 2 解釋 子陣列 4,3 是該條件下的長...