题目描述:
给你一个整数数组 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
方法1:
主要思路:解题链接汇总
(1)使用前缀和,统计前缀和中的偶数的个数,和根据当前位置的前缀和的奇偶性,据定当前位置新增的和为奇数的子数组的数目;
class Solution {
public:
int numOfSubarrays(vector<int>& arr) {
if(arr.empty()){
return 0;
}
vector<int> sum_pre(arr.size()+1,0);
for(int i=0;i<arr.size();++i){
sum_pre[i+1]=sum_pre[i]+arr[i];
}
long res=0;
int cur_even=1;
for(int i=1;i<sum_pre.size();++i){
if(sum_pre[i]&1){
res+=cur_even;
}
else{
res+=i-cur_even;
++cur_even;
}
}
return res%1000000007;
}
};
方法2:
主要思路:
(1)思路和方法1类型,只是减少了前缀和数组的使用,减少内存的消耗
class Solution {
public:
int numOfSubarrays(vector<int>& arr) {
long res=0;
int cur_even=1;
int cur_sum=0;
for(int i=0;i<arr.size();++i){
cur_sum+=arr[i];
if(cur_sum&1){
res+=cur_even;
}
else{
res+=i-cur_even+1;
++cur_even;
}
}
return res%1000000007;
}
};
该博客介绍了如何通过前缀和技巧解决编程问题,即计算整数数组中和为奇数的子数组数量。提供两种不同的解决方案,方法1和方法2,均减少了内存消耗,对数组遍历并根据当前和的奇偶性更新结果。通过这种方法,可以高效地求解大数组下的子数组奇偶性计数,并对结果进行取模操作,以适应大数值的处理。
529

被折叠的 条评论
为什么被折叠?



