学更好的别人,
做更好的自己。
——《微卡智享》
本文长度为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;
}
完
扫描二维码
获取更多精彩
微卡智享
「 往期文章 」