演算法 陣列字首和處理

2021-10-06 14:31:15 字數 1355 閱讀 8521

對於陣列和的處理

考慮i到j的和 為 sum(:j)-sum(:i)用來替代中間和

給定乙個整數陣列 a,返回其中元素之和可被 k 整除的(連續、非空)子陣列的數目。

示例:輸入:a = [4,5,0,-2,-3,1], k = 5

輸出:7

解釋:有 7 個子陣列滿足其元素之和可被 k = 5 整除:

[4, 5, 0, -2, -3, 1], [5], [5, 0], [5, 0, -2, -3], [0], [0, -2, -3], [-2, -3]

1 <= a.length <= 30000

-10000 <= a[i] <= 10000

2 <= k <= 10000

解答:想法:

1 一開始想到暴力解答,迴圈得到sum然後得到mod,滿足則加一,百分百超時

2 考慮使用字典記錄已經存在的i,j區間的mod,使用回溯法,最後仍然超時,也是進行了n^2的遍歷

3. 看答案,對mod進行字典儲存,同一mod的區間相減 肯定滿足被k整除!對key的val進行遍歷,使用c(n,2)的概率統計法,則可以得到該mod的整除區間

特殊情況:mod為0的情況,自加一!因為本身相當於多乙個起點,一開始就能做到被整除)

**:

class

solution

:def

subarraysdivbyk

(self, a, k)

: temp =

count =

0for i in

range

(len

(a))

: count+=a[i]

a,b =

divmod

(count,k)

if b in temp:

temp[b]+=1

else

:#print(i,b)

temp[b]=1

#print(temp)

res =

0for key in temp:

if temp[key]

>1:

res+=

(temp[key]

*(temp[key]-1

))/2

return

int(res)

su = solution(

)arr =[4

,5,0

,-2,

-3,1

]k =

5res = su.subarraysdivbyk(arr,5)

print

(res)

演算法 陣列和視窗 陣列

給定乙個整型陣列arr和乙個大小為w的視窗,視窗從陣列最左邊滑動到最右邊,每次向右滑動乙個位置,求出每一次滑動時視窗內最大元素的和。輸入第一行為用例個數,每個測試用例輸入的第一行為陣列,每乙個元素使用空格隔開 第二行為視窗大小。輸出每個測試用例結果。14 3 5 4 3 3 6 7 3 陣列與視窗 ...

演算法 陣列和鍊錶

注 本文僅為筆記。原文 一維陣列記憶體定址公式 對於二維陣列 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...