使用 C++ 查找具有 m 个奇数的子数组的数量

如果您曾经使用过 C++,那么您必须知道子数组是什么以及它们有多大用处。众所周知,在 C++ 中,我们可以轻松解决多个数学问题。因此,在本文中,我们将解释有关如何借助 C++ 中的这些子数组找到 M 个奇数的完整信息。

在这个问题中,我们需要找到许多由给定数组和整数 m 组成的子数组,其中每个子数组都包含恰好 m 个奇数。所以这是这种方法的简单示例 -

Input : array = { 6,3,5,8,9 }, m = 2

Output : 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

回到顶部