給你乙個正整數陣列 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...