「这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战」
点赞再看,养成习惯。微信搜索【一条coding】关注这个梦想弃码从文程序员。
本文收录于技术专家修炼,里面有我的学习路线、系列文章、面试题库、自学资料、电子书等。欢迎star⭐️
题目本身不难,主要是题目隐含条件没说清楚,并不是所有的子数组,而是连续的子数组。 即[a,b,c]的子数组为[a],[b],[a,b],[c],[a,c],[b,c],[a,b,c] 不存在[a,c]!!
——leetcode此题热评
前言
大家好,我是一条,欢迎来到我的算法频道。
只做有趣的算法题,只为面试写算法。
Question
1524. 和为奇数的子数组数目
难度:中等
给你一个整数数组 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 。
Solution
前缀和解决数组问题经常被用到,链表也有借鉴其思想。
简单说就是求前n个元素的和,n逐次加1,有了前缀和,就方便计算数组的差。
arr[i]=per[i]-pre[i-1]
前缀和模板
// 计算前缀和
for(int i = 1; i <= n; i++){
pre[i] = pre[i - 1] + arr[i - 1];
}
Code
/**
* @author 一条coding
*/
// 计算前缀和之后
class Solution {
public int numOfSubarrays(int[] arr) {
final int MODULO = 1000000007;
int odd = 0, even = 1;
int subarrays = 0;
int sum = 0;
int length = arr.length;
for (int i = 0; i < length; i++) {
sum += arr[i];
subarrays = (subarrays + (sum % 2 == 0 ? odd : even)) % MODULO;
if (sum % 2 == 0) {
even++;
} else {
odd++;
}
}
return subarrays;
}
}
最后
点赞,点赞,还TMD是点赞!