演算法 陣列和視窗 陣列

2021-09-28 14:35:37 字數 2976 閱讀 2568

給定乙個整型陣列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...