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 ...