使用 C++ 查找具有 m 个奇数的子数组的数量
如果您曾经使用过 C++,那么您必须知道子数组是什么以及它们有多大用处。众所周知,在 C++ 中,我们可以轻松解决多个数学问题。因此,在本文中,我们将解释有关如何借助 C++ 中的这些子数组找到 M 个奇数的完整信息。
在这个问题中,我们需要找到许多由给定数组和整数 m 组成的子数组,其中每个子数组都包含恰好 m 个奇数。所以这是这种方法的简单示例 -
Input : array = { 6,3,5,8,9 }, m = 2Output : 5
Explanation : Subarrays with exactly 2 odd numbers are
{ 3,5 }, { 6,3,5 }, { 3,5,8 }, { 5,8,9 }, { 6,3,5,8 }, { 3,5,8,9 }
Input : array = { 1,6,3,2,5,4 }, m = 2
Output : 6
Explanation : Subarrays with exactly 2 odd numbers are
{ 1,6,3 }, { 3,2,5 }, { 1,6,3,2 }, { 6,3,2,5 }, { 3,2,5,4 }, { 6,3,2,5,4 }
第一种方法
在这种方法中,所有可能的子数组都是从给定的数组中生成的,并且每个子数组都被精确地检查 m 个奇数。这是一种简单的生成和查找方法,该方法的时间复杂度为 O(n 2 )。
示例
#include <bits/stdc++.h>输出结果using namespace std;
int main (){
int a[] = { 1, 6, 3, 2, 5, 4 };
int n = 6, m = 2, count = 0; // n 是数组的大小,要在子数组中找到的 m 个数字,
// count 是具有 m 个奇数的子数组的数量
for (int i = 0; i < n; i++){ // 外循环来处理每个元素。
int odd = 0;
for (int j = i; j < n; j++) {// 查找具有 m 个编号的子数组的内循环
if (a[j] % 2)
odd++;
if (odd == m) // 如果奇数变为等于 m。
count++;
}
}
cout << "具有 n 个数字的子数组的数量是: " << count;
return 0;
}
具有 n 个数字的子数组的数量是: 6
以上代码说明
在这段代码中,我们使用嵌套循环来查找具有 m 个奇数的子数组,外循环用于递增“i”,它将用于处理数组中的每个元素。
内部循环用于查找子数组并处理元素,直到奇数计数器达到 m,为找到的每个子数组增加结果计数器计数,最后打印存储在计数变量中的结果。
第二种方法
另一种方法是创建一个数组,用于存储具有“i”个奇数的前缀数量,处理每个元素,并为找到的每个奇数增加奇数的数量。
当奇数的计数超过或等于 m 时,在前缀数组中的 (odd - m ) 位置添加数字。
当odd 大于或等于m 时,我们计算形成的子数组的数量,直到将索引和“odd - m”数添加到count 变量中。处理完每个元素后,结果将存储在 count 变量中。
示例
#include <bits/stdc++.h>输出结果using namespace std;
int main (){
int array[ ] = { 1, 6, 3, 2, 5, 4 };
int n = 6, m = 2, count = 0, odd = 0, i;
int prefix_array[n + 1] = { 0 };
// 外循环处理数组的每个元素
for (i = 0; i < n; i++){
prefix_array[odd] = prefix_array[odd] + 1; // 在 prefix_array[ ] 中的奇数索引处实现值
// 如果数组元素为奇数,则增加奇数变量
if (array[i] % 2 == 0)
odd++;
// 如果奇数元素的数量等于或大于 m
// 然后找到可以形成直到索引的可能子数组的数量。
if (odd >= m)
count += prefix_array[odd - m];
}
cout << "具有 n 个数字的子数组的数量是: " << count;
return 0;
}
具有 n 个数字的子数组的数量是: 6
以上代码说明
用起始值初始化数组和变量 -
int array[ 6 ] = { 1, 6, 3, 2, 5, 4 };int n = 6, m = 2, count = 0, odd = 0, i;
int prefix_array[n + 1] = { 0 };
在这里,我们用数组的大小初始化变量 n,用要查找的奇数个数初始化变量 m,用 0 计数以保持可能子数组的计数,用 0 计算奇数,用 0 初始化大小为 n + 1 的 prefix_array。
理解循环
for (i = 0; i < n; i++){prefix_array[odd] = prefix_array[odd] + 1;
if (array[i] % 2 == 0)
odd++;
if (odd >= m)
count += prefix_array[odd - m];
}
在这个循环中,我们在 prefix_array[ ] 中的奇数索引处实现值,如果找到奇数,则增加奇数变量。我们发现当奇数变量等于或大于 m 时,可以形成子数组的数量直到索引。
最后,我们打印多个子数组,其中 m 个奇数存储在 count 变量中并获得输出。
结论
在本文中,我们了解了从两种方法中找到具有 m 个奇数的子数组数量的方法 -
生成每个子数组并检查其中的 m 个奇数,并为找到的每个子数组增加计数。这段代码的时间复杂度是 O(n2)。
高效的方法,它遍历数组的每个元素并创建一个前缀数组,并在前缀数组的帮助下找到结果。这段代码的时间复杂度是O(n)。
希望您发现这篇文章有助于理解问题和解决方案。
以上是 使用 C++ 查找具有 m 个奇数的子数组的数量 的全部内容, 来源链接: utcz.com/z/317261.html