纯萌新手把手教你做每日亿题(N1248)

8 篇文章 0 订阅
3 篇文章 0 订阅

我先把题目放在这里

在这里插入图片描述

解题思路:

第i个奇数和第i+k-1个质数之间一定有K个奇数(第1个和第1+3-1个之间有3个,1,2,3三个)

因为数组是按顺序的,所以这两个奇数之间的偶数一定在这个子数组里

所以是第i个奇数第i-1个奇数之间的偶数,第I+k-1个奇数i+k个奇数之间的偶数

他们产生的排列组合产生了数组的变化

而组合种类是第i个奇数的下标-第i-1个奇数的下标 * 第i+k个奇数的下标-第i+k-1个奇数的下标

我们假设左边有三个偶数,右边有四个偶数

为什么种类不是3的4次方呢?

这是因为我们的子数组是有顺序的,所以左面只有三种选择,而对应的每种选择右边都有四种选择

所以就是3*4

数据结构:

我们建立一个数组,储存每个奇数的下标

然后遍历这个数组,将每组奇数产生子数组的可能性加在一起,就是所有的可能性

所以时间复杂度是O(N)

C++代码:

class Solution {
public:
    int numberOfSubarrays(vector<int>& nums, int k) {
        int i,j=0;
        int n=(int)nums.size();
        int ji[n+2];
        for(i=0;i<n;++i)
        {
            if(nums[i]%2!=0)
            {
                ji[++j]=i;
            }
        }
        int sum=0;
        
        ji[0]=-1;ji[++j]=n;

        for(i=1;i+k<=j;++i)
        {

            sum+=(ji[i]-ji[i-1])*(ji[i+k]-ji[i+k-1]);
        }
        return sum;
    }
};

打卡成功!

继续努力

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值