【LeetCode】 1248. 统计「优美子数组」

题目

题目传送门:传送门(点击此处)
在这里插入图片描述

题解

思路

  1. 仔细分析一下题目,我们要找的是当前数组的连续子数组,其实不一定非得要把每个数组都找到,只要能算出最后的数量就可以了,所以,我们需要思考一下,如何确定这个数量是需要考虑的
  2. 简化一下,只要找到每个奇数前后的数字的个数,我们就能确定每种可能的个输了

给定一个数组,和一个k值
在这里插入图片描述
我们找到这个数组中每个奇数间隔数字的个数表如下:
在这里插入图片描述
到现在可能还不是很明确为什么要维护这个表,这个表的含义:

1 行:第 1 个奇数之前的偶数个数 + 1
2 行:第 2 个奇数到第 3 个奇数之间的偶数的个数 + 1
3 行:第 3 个奇数到第 4 个奇数之间的偶数的个数 + 1
4 行:第 3 个奇数到最后的偶数个数 + 1

加 1 是代表可能出现的情况数

下面举个例子,这里列出了所有的情况,很容易看出,找带有两个奇数的数组,我们只需要考虑两个奇数 左边右边 的偶数的个数即可

下图 蓝色 的部分,1 2 2 1 左边有三种情况:0个21个22个21 2 2 1 右边有四种情况:0个21个22个23个2,所以这时就一共有 3 * 4 = 12 种情况

下图 绿色 的部分,1 2 2 2 1 左边有三种情况:0个21个22个21 2 2 2 1 右边有1种情况:0个2,所以这时就一共有 3 * 1 = 3 种情况

由此,可以计算出结果为 12 + 3 = 15 种情况
在这里插入图片描述

code

class Solution {
    public int numberOfSubarrays(int[] nums, int k) {
        int res = 0;
        List<Integer> list = new ArrayList();
        int len = nums.length;
        int count = 1;
        for(int i = 0; i < len; i++) {
            int temp = nums[i] % 2;
            if(temp == 0) {
                count++;
            }
            else {
                list.add(count);
                count = 1;
            }
        }
        list.add(count);
        
        int size = list.size();
        if(k > size - 1) return 0;

        for(int i = 0; i < size - k; i++) {
            res += list.get(i) * list.get(i + k);
        }

        return res;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Geek-Banana

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值