給定乙個整型陣列arr和乙個大小為w的視窗,視窗從陣列最左邊滑動到最右邊,每次向右滑動乙個位置,求出每一次滑動時視窗內最大元素的和。
輸入第一行為用例個數, 每個測試用例輸入的第一行為陣列,每乙個元素使用空格隔開;第二行為視窗大小。
輸出每個測試用例結果。
14 3 5 4 3 3 6 7
3
# 陣列與視窗
# 題目要求出每次滑動後視窗中的最大值,最終把所有最大值求和。
# 暴力解法:由於是求最大值,所以並不需要每次滑動都重新構建視窗,
# 只有當最大值滑出視窗時,才需要重新構建視窗(此時是為了重新求得最大值)
nums =
int(
input()
)for n in
range
(nums)
: arr =
list
(map
(int
,input()
.split())
)# 輸入陣列
w_len =
int(
input()
)# 輸入視窗大小
wins =
[arr[x]
for x in
range
(w_len)
]# 初始化視窗
maxnum =
max(wins)
# 獲得視窗中最大值
maxindex = wins.index(maxnum)
# 最大值在視窗中的下標
result = maxnum
# 迴圈滑動視窗直到陣列,每次滑動,最大值在視窗的下標就會-1,此時需判斷最大值是否已經脫離視窗,如果脫離,就重新構建視窗並獲得最大值及其下標
# 每次滑動會獲得乙個新的陣列值,此時比較新值與最大值的大小,若新值》最大值,則替換之,否則繼續滑動
# 主要思想是,由於只是求最大值,因此無需每次都重新構建視窗,只有當最大值脫離視窗時,才需要重新構建視窗(此時作用是重新求得最大值)
for i in
range(1
,len
(arr)
- w_len +1)
: maxindex -=
1if maxindex <0:
# 最大值脫離視窗,重新構建視窗求最大值
wins =
[arr[x]
for x in
range
(i, w_len + i)
] maxnum =
max(wins)
maxindex = wins.index(maxnum)
result += maxnum
elif arr[i + w_len -1]
>= maxnum:
# 新陣列值大於等於最大值,替換
maxnum = arr[i + w_len -1]
maxindex = w_len -
1 result += maxnum
else
: result += maxnum
print
(result)
# 動態規劃:定義雙端佇列,隊頭到隊尾遞減,用來記錄最大值。遍歷陣列,每次與隊尾元素進行比較,若比隊尾小,
# 則直接入隊,若大,則隊尾元素出隊,當前陣列元素繼續於隊尾元素比較,直到比隊尾元素小或者隊列為空。
# 另外,當隊頭元素值出了視窗時,要從隊頭彈出。
if __name__ ==
'__main__'
: nums =
int(
input()
)for n in
range
(nums)
: arr =
list
(map
(int
,input()
.split())
)# 輸入陣列
w_len =
int(
input()
)# 輸入視窗大小
result =
0 maxnum =
# 最大值雙端佇列,儲存最大值在陣列中的座標
for i in
range(0
,len
(arr)):
while
len(maxnum)
>
0and arr[maxnum[0]
]<= arr[i]
:# 隊尾元素和當前元素相比較,小則出列
maxnum.pop(
0)
maxnum.insert(
0, i)
# 當前元素入列
if maxnum[-1
]+ w_len -
1< i:
# 隊頭元素(即當前最大值)出窗,則出列
maxnum.pop(-1
)if i >= w_len -1:
result += arr[maxnum[-1
]]print
(result)
class
solution
list.
addlast
(i);
} re[0]
= nums[list.
peekfirst()
];for(
int j = k; j < nums.length; j++
) list.
addlast
(j);
if(list.
peekfirst()
< j - k +1)
re[j-k+1]
= nums[list.
peekfirst()
];}return re;
}}
演算法 陣列 滑動視窗
閒著無聊開啟as擼個小演算法吧 給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為 針對陣列的滑動視窗有以下6個 public arraylistmaxinwindows int num,int size ...
演算法 陣列和鍊錶
注 本文僅為筆記。原文 一維陣列記憶體定址公式 對於二維陣列 a n a i addr base addr i type size 二維陣列記憶體定址公式 對於二維陣列 a m n a i j addr base addr i n j type size 三維陣列記憶體定址公式 對於三維陣列 a m...
演算法 陣列和鍊錶
注 本文僅為筆記。原文 一維陣列記憶體定址公式 對於二維陣列 a n a i addr base addr i type size 二維陣列記憶體定址公式 對於二維陣列 a m n a i j addr base addr i n j type size 三維陣列記憶體定址公式 對於三維陣列 a m...