1588 所有奇數長度子陣列的和

2022-05-25 07:06:16 字數 3993 閱讀 3696

給你乙個正整數陣列 arr ,請你計算所有可能的奇數長度子陣列的和。

子陣列 定義為原陣列中的乙個連續子串行。

請你返回 arr 中 所有奇數長度子陣列的和 。

示例 1:

輸入:arr = [1,4,2,5,3]

輸出:58

解釋:所有奇數長度子陣列和它們的和為:

[1] = 1

[4] = 4

[2] = 2

[5] = 5

[3] = 3

[1,4,2] = 7

[4,2,5] = 11

[2,5,3] = 10

[1,4,2,5,3] = 15

我們將所有值求和得到 1 + 4 + 2 + 5 + 3 + 7 + 11 + 10 + 15 = 58

示例 2:

輸入:arr = [1,2]

輸出:3

解釋:總共只有 2 個長度為奇數的子陣列,[1] 和 [2]。它們的和為 3 。

示例 3:

輸入:arr = [10,11,12]

輸出:66

1 <= arr.length <= 100

1 <= arr[i] <= 1000

用 excel **展示這個二維 kadane 演算法的過程。

如圖下面所示的矩陣,黃色黃色部分,4×5

'>4×5

4×5 的大小。先定義幾個變數:

1. 變數 l

'>l

l : 代表遍歷時,當前子矩陣的左邊位置;

2. 變數 r

'>r

r : 代表遍歷時,當前子矩陣的右邊位置;

3. 右邊淺綠色,與矩陣的 row

數'>row數

row數 相同的臨時儲存區,是將當前的 l

'>l

l 列、l+1

'>l+1

l+1 列、……、r−1

'>r−1

r−1 列、r

'>r

r 列,進行列相加,然後再用 kadane 演算法判斷相加得到的列陣列(此時即為一維陣列了,可以用一般意義上的 kadane 演算法),求此時元素連續和最大的子陣列,並與之前的最大值進行比較(這一點會在下面的過程中體現出來);

4. 變數 cur

rent

sum'>currentsum

currentsum : 當前 l、r

'>l、r

l、r 組成的子矩陣(注意:這個子矩陣的「行數量「與原來大矩陣相同),其中這個矩陣的子矩陣,產生的最大的和;

5. 變數 max

sum'>maxsum

maxsum : 紀錄目前遍歷下來的最大的子矩陣和;

6. 變數 max

left

'>maxleft

maxleft : 紀錄目前遍歷下來的最大子矩陣的左邊位置;

7. 變數 max

righ

t'>maxright

maxright : 紀錄目前遍歷下來的最大子矩陣的右邊位置;

8. 變數 max

up'>maxup

maxup : 紀錄目前遍歷下來的最大子矩陣的上面位置;

9. 變數 max

down

'>maxdown

maxdown : 紀錄目前遍歷下來的最大子矩陣的下面位置;

注意:如果 cur

rent

sum'>currentsum

currentsum 不大於 max

sum'>maxsum

maxsum,則保持 max

sum、

maxl

eft、

maxr

ight

、max

up、m

axdo

wn'>maxsum、maxleft、maxright、maxup、maxdown

maxsum、maxleft、maxright、maxup、maxdown 這幾個變數值不變。

第一次遍歷,l、r

'>l、r

l、r 都在矩陣的開始 0 處:

第二次遍歷, 此時將 r

'>r

r 向右移動乙個位置到 1 處,保持 l

'>l

l 位置不變。將 l、r

'>l、r

l、r 兩行之間的矩陣進行列相加,得到 3 6

0 0'>3600

,求這個 3 6

0 0'>3600

序列的和最大子串行。

很容易看出,最大值為9,所以 cur

rent

sum'>currentsum

currentsum 為9,那麼發現9比之前的 max

sum=

4'>maxsum=4

maxsum=4 要大,所以,此時將 9 給 max

sum=

9'>maxsum=9

maxsum=9。max

left

=0'>maxleft=0

maxleft=0 紀錄此時的 l=0

'>l=0

l=0,max

righ

t=1'>maxright=1

maxright=1 紀錄此時的 r=1

'>r=1

r=1,max

up'>maxup

maxup 紀錄此時最大子串行的上面開始位置:max

up=0

'>maxup=0

maxup=0,max

down

'>maxdown

maxdown 紀錄此時最大子串行的下面結束位置:max

第三次遍歷:

第四次遍歷:

第五次遍歷:

第六次遍歷:

第七次遍歷:

第八次遍歷:

第九次遍歷:

第十次遍歷:

第十一次遍歷:

第十二次遍歷:

第十三次遍歷:

第十四次遍歷:

第十五次遍歷:

經過十五次的遍歷後,我們終於找到了這個矩陣,就是上圖中紅色區域部分。這個大矩陣(4×5

'>4×5

4×5) 的最大元素和為18。

這就是2d kadane演算法的過程。這個演算法的空間複雜度為: o(r

ow)'>o(row)

o(row),時間複雜度為:o(c

olum

n×co

lumn

×row

)'>o(column×column×row)

1588 所有奇數長度子陣列的和

題目描述 給你乙個正整數陣列 arr 請你計算所有可能的奇數長度子陣列的和。子陣列 定義為原陣列中的乙個連續子串行。請你返回 arr 中 所有奇數長度子陣列的和 示例 1 輸入 arr 1,4,2,5,3 輸出 58 解釋 所有奇數長度子陣列和它們的和為 1 1 4 4 2 2 5 5 3 3 1,...

1588 所有奇數長度子陣列的和

給你乙個正整數陣列 arr 請你計算所有可能的奇數長度子陣列的和。子陣列 定義為原陣列中的乙個連續子串行。請你返回 arr 中 所有奇數長度子陣列的和 示例 1 輸入 arr 1,4,2,5,3 輸出 58 解釋 所有奇數長度子陣列和它們的和為 1 1 4 4 2 2 5 5 3 3 1,4,2 7...

1588 所有奇數長度子陣列的和

給你乙個正整數陣列 arr 請你計算所有可能的奇數長度子陣列的和。子陣列 定義為原陣列中的乙個連續子串行。請你返回 arr 中 所有奇數長度子陣列的和 示例 1 輸入 arr 1,4,2,5,3 輸出 58 解釋 所有奇數長度子陣列和它們的和為 1 1 4 4 2 2 5 5 3 3 1,4,2 7...