1524 和為奇數的子陣列數目(動態規劃 字首和)

2021-10-24 13:13:22 字數 2259 閱讀 4321

1. 問題描述:

給你乙個整數陣列 arr 。請你返回和為奇數的子陣列數目。由於答案可能會很大,請你將結果對 10 ^ 9 + 7 取餘後返回。

示例 1:

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

輸出:4

解釋:所有的子陣列為 [[1],[1,3],[1,3,5],[3],[3,5],[5]] 。

所有子陣列的和為 [1,4,9,3,8,5].

奇數和包括 [1,9,3,5] ,所以答案為 4 。

示例 2 :

輸入:arr = [2,4,6]

輸出:0

解釋:所有子陣列為 [[2],[2,4],[2,4,6],[4],[4,6],[6]] 。

所有子陣列和為 [2,6,12,4,10,6] 。

所有子陣列和都是偶數,所以答案為 0 

示例 3:

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

輸出:16

示例 4:

輸入:arr = [100,100,99,99]

輸出:4

示例 5:

輸入:arr = [7]

輸出:1

2. 思路分析:

① 由題可知我們需要求解的是關於區間和的問題,看到區間和的字眼,首先需要想到的是字首和的思路,所以比較容易想到的是遍歷陣列計算[0, i]的字首和,依次檢查長度為1,2....len(arr)的區間和然後判斷是否是奇數對滿足條件的區間進行計數即可,但是陣列的長度在1 <= arr.length <= 10 ^ 5範圍,所以遍歷一遍陣列 + 檢查所有長度範圍的區間和是否是奇數的思路肯定會超時,感覺還有其他更優的辦法

② 於是看了一下力扣的官方題解,發現題解思路真的好棒,感覺有點像動態規劃的思想,思路的核心:判斷以當前位置i結束的子陣列的字首和是奇數還是偶數,並且需要使用兩個變數來記錄[0, i - 1]這個區間的字首和為奇數、偶數的數目,其實我們並不關心字首和為奇數還是偶數的數值,我們只關心字首和為奇數還是偶數的數目,這樣可以根據[0:i]這個位置的字首和是奇數還是偶數 + [0: i - 1]字首和為奇數與偶數的數目計算出[0:i]這個位置的和為奇數的區間數目,下面畫出具體的區間會更好理解一點:

0                           i

even, odd 記錄[0, i - 1]位置的字首和為偶數、奇數的數目

1)當sum[0:i]的字首和為奇數的時候,這個時候我們需要看[0, i - 1]偶數even的數目,而這些字首和為偶數的下乙個位置到i這個位置的和肯定是奇數的

0                           i

0   j                        i

sum[0:i]為奇數,sum[0, j]為偶數, 所以sum[j + 1, i]為奇數,所以這裡涉及到的是乙個區間相減的問題,[0:i]和為奇數的區間減去[0:j]和為偶數的區間那麼得到的[j + 1:i]這個區間和就為奇數:奇數和區間 + 奇數和區間 = 偶數和區間

所以我們只需要統計奇數與偶數的數目而並不需要統計具體的數值,有多少個偶數那麼說明這些偶數的下乙個位置到當前的結束位置i就有多少個和為奇數的區間

2)對於sum[0:i]為偶數的時候那麼我們需要看的是[0:i - 1]有多少個的奇數,方法與上面的是一樣的:奇數和區間 + 奇數和區間 = 偶數和區間

③ 感覺動態規劃關於區間的問題很多是以位置i結尾的陣列的某個含義

3. **如下:

力扣官方**:

from typing import list

class solution:

def numofsubarrays(self, arr: list[int]) -> int:

modulo = 10 ** 9 + 7

odd, even = 0, 1

subarrays = 0

total = 0

for x in arr:

total += x

subarrays += (odd if total % 2 == 0 else even)

if total % 2 == 0:

even += 1

else:

odd += 1

return subarrays % modulo

5457 和為奇數的子陣列數目。 字首和

給你乙個整數陣列 arr 請你返回和為 奇數 的子陣列數目。由於答案可能會很大,請你將結果對 10 9 7 取餘後返回。示例 1 輸入 arr 1,3,5 輸出 4 解釋 所有的子陣列為 1 1,3 1,3,5 3 3,5 5 所有子陣列的和為 1,4,9,3,8,5 奇數和包括 1,9,3,5 所...

leecode 5457 和為奇數的子陣列數目

題目描述 給你乙個整數陣列 arr 請你返回和為 奇數 的子陣列數目。由於答案可能會很大,請你將結果對 10 9 7 取餘後返回。示例 1 輸入 arr 1 3,5 輸出 4 解釋 所有的子陣列為 1 1 3 1,3 5 3 3,5 5 所有子陣列的和為 1,4,9,3,8,5 奇數和包括 1,9,...

和為k的子陣列

給定乙個整數陣列和乙個整數 k,你需要找到該陣列中和為 k 的連續的子陣列的個數。示例 1 輸入 nums 1,1,1 k 2 輸出 2 1,1 與 1,1 為兩種不同的情況。說明 陣列的長度為 1,20,000 陣列中元素的範圍是 1000,1000 且整數 k 的範圍是 1e7,1e7 o n ...