題目描述:
給你乙個整數陣列 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
*1 <= arr.length <= 10^5
1 <= arr[i] <= 100*
解題思路(本人)一般思路:
思路講解:
因為和為奇數的條件:奇數個奇數相加(偶數只能作為變動子陣列的個數有價值)
奇數的個數i:1,3,5,7,9…以次類推;
當前 (i個奇數)的符合要求的子陣列的個數;
當i = 3時;
以 「00000(101001)000」 :
(i個奇數)前的偶數為 5 ;
(i個奇數)後的偶數為 3 ;
故: 子陣列的個數5 * 3 + 5 + 3 + 1 = 4 * 6;
**實現:
class solution
sub.push_back(arr.size()) ;
long long ret = 0 ;
int cha , cha2 ;
//第一層是表示奇數的個數:1,3,5,7,......
for(i = 1 ; i <= sub.size() - 2 ; i = i + 2)
//cout << j << endl ;
}return ret % 1000000007 ;
}};
複雜度計算:
時間複雜度:o(n * n / 2);
空間複雜度:o(n); vector sub的size()最大為n;
利用動態規劃的思想,記錄當前(i)位置的 符合要求的子陣列數目;
例如:偶數用『0』表示,奇數用『1』表示;
str = 「010001000101010000」
old[i]:(i) 表示 在字串中的下標,從0開始;old[0] = 0 ;
i = 0 : if(『0』)old[i] = 0 ; else(『1』) old[0] = 1 ;
迴圈:i = 1 : old[i] = i + 1 - old[i -1] ;
i = 2 : old[i] = old[i -1] ;……
迴圈結束條件:i < str .size() ;
**實現:class solution {
public:
int numofsubarrays(int* a, int n){
intmax_t ans = 0, old = 0;
for (int i=0; i複雜度計算:
時間複雜度:o(n);
空間複雜度:o(1);
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 所...
1524 和為奇數的子陣列數目(動態規劃 字首和)
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,...
和為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 ...