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

2021-10-08 13:04:26 字數 2280 閱讀 7843

題目描述:

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