LeetCode|1248.优美子数组--C++题解

学更好的别人,

做更好的自己。

——《微卡智享》

本文长度为1609,预计阅读5分钟

前言

上一篇《LeetCode|200.岛屿数量--C++题解》发布后,自己也做了相关的视频,由于是第一次做,感觉在整个视频的表达上还不够清晰,所以本篇也是花了不少功夫,将整个解题做为一个完整的视频输出,写了这么久的文章后,也要对自己的质量要求更高。所以从这篇开始,我更注重每篇文章的质量了,而且自己也开通了视频号的,所以文章我基本会以视频的方式呈现出来,让大家看了印象更深刻一些。

视频讲解

题目

微卡智享

解题思路

微卡智享

#实现思路
1首先遍历整个数组,找出所有的奇数的下标位置存放到新建的数组中
2在新的奇数下标数组中再进行遍历
3通过输入的K值(奇数个数),计算起始奇数前置有几个偶数,结束奇数中存在几个偶数
4
然后根据公式:x * y + x + y + 1,计算出当前奇数所含有的数组个数
5
重复第2步直接循环结束,最后输出总的个数

通过上面视频可以看到整个计算的过程。

代码实现

微卡智享



//LeetCode1248题 统计【优美子数组】
//给你一个整数数组 nums 和一个整数 k。
//如果某个连续子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」。
//请返回这个数组中「优美子数组」的数目。


//示例 1:
//输入:nums = [1, 1, 2, 1, 1], k = 3
//输出:2
//解释:包含 3 个奇数的子数组是[1, 1, 2, 1] 和[1, 2, 1, 1] 。
//示例 2:
//输入:nums = [2, 4, 6], k = 1
//输出:0
//解释:数列中不包含任何奇数,所以不存在优美子数组。
//示例 3:


//输入:nums = [2, 2, 2, 1, 2, 2, 1, 2, 2, 2], k = 2
//输出:1
//提示:
//1 <= nums.length <= 50000
//1 <= nums[i] <= 10 ^ 5
//1 <= k <= nums.length


//解题:
//1.遍历一次数组计算所有的奇数获取下标位
//2.根据输入的K值计算奇数下标外侧左右的长度
//3.根据递推出的公式 x*y+x+y+1算出数组




#include<iostream>
#include<vector>


using namespace std;


int numberOfSubarrays(vector<int>&, int);


int main(int argc, char** argv) {
  vector<int> nums = { 2,2,2,1,2,2,1,2,2,2 };


  numberOfSubarrays(nums, 2);


  return 0;
}


int numberOfSubarrays(vector<int>& nums, int k)
{
  int subarrays = 0;
  vector<int> tmp;
  //计算出所有奇数存入新的数组中
  for (int i = 0; i < nums.size(); ++i) {
    if (nums[i] & 1) tmp.push_back(i);
  }


  for (int j = 0; j < tmp.size(); ++j) {
    //启始下标
    int beginidx = tmp[j];
    //结束下标
    int endidx = (j + k - 1 >= tmp.size()) ? -1 : tmp[j + k - 1];


    //当结束下标不为-1时开始计算数组个数,否则为0
    if (endidx != -1) {
      //计算当前数组的前面偶数个数
      int x = (j == 0) ? beginidx : beginidx - tmp[j - 1] - 1;
      //计算当前数组后面的偶数个数
      int y = (j + k >= tmp.size()) ? nums.size() - tmp[j + k - 1] - 1 : tmp[j + k] - tmp[j + k - 1] - 1;


      //累加当前个数
      subarrays += x * y + x + y + 1;
    }
  }


  return 0;
}


扫描二维码

获取更多精彩

微卡智享

「 往期文章 」

LeetCode|200.岛屿数量--C++题解

学习|C++冒泡排序小习题

学习|Android JetPack组件---ORM框架Room的使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Vaccae

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

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

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

打赏作者

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

抵扣说明:

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

余额充值