【算法通关】1524. 和为奇数的子数组数目——前缀和

8,806 阅读2分钟

「这是我参与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是点赞!