【前缀和+组合】1524.和为奇数的子数组数目

1524.png

求和为奇数的子数组数组,如果直接暴力枚举显示不可取的,数据范围比较大。

涉及到的数组和的问题,通常第一想法就是考虑能不能用前缀和去处理一下。

对应到这题中,正好可以用前缀和处理,在处理每个位置的前缀和时,我们可以动态的维护一种长度为2的数组,这个数组用于统计 【截止到当前位置】和为奇数或者偶数的数量

数组: arr = [1, 3, 5]
前缀和为: sum = [0 , 1, 4, 9]
统计数组结果分别为: [1, 0] [1, 1] [2, 1] [2, 2]

这个统计数组有何用?
用于实现不同的组合的累加

以统计数组的第三个状态:即前缀和为4时,对应的统计状态[2, 1],表示目前位置有2个和为偶数,一个和为奇数。
接下来利用统计数组的中的奇或偶的个数进行不同的【组合】,遍历到 前缀和4时,4是偶数,要想变成奇数,那么就必须与奇数相加才可以,因为 4 可以和【任意一个】奇数相组合。

class Solution {
    int mod = (int)1e9 + 7;
    public int numOfSubarrays(int[] arr) {
        int[] cnt = new int[] {1, 0};
        int n = arr.length;
        long r = 0;
        for(int i = 0, sum = 0; i < n; i++) {
            ++cnt[sum ^= arr[i] & 1];
            r += cnt[sum ^ 1];
        }
        return (int) (r % mod);
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容