在C ++中找到具有正好为k个奇数的最长子数组

假设我们有一个包含n个元素的数组。问题是要找到正好有k个奇数的最长子数组。因此,如果A = [2、3、4、11、4、12、7]且k = 1,则输出将为4,子数组为[4、11、4、12]

我们可以使用滑动窗口解决此问题。任务如下-

  • 初始化max:= 0,count:= 0和start:= 0

  • 对于介于0到n – 1之间的i,请执行以下操作

    • 如果max <(i –开始+1),则max:=(i –开始+1)

    • 如果arr [start] mod 2不为0,则将count减1

    • 开始增加1

    • 如果arr [i] mod 2不为0,则将count增加1

    • 当count> k并开始<= i时,请执行以下操作

    • 如果count = k,则

    • 返回最大值

    示例

    #include<iostream>
    using namespace std;
    int oddSubarrayMaxLength(int arr[], int n, int k) {
       int max_len = 0, count = 0, start = 0;
       for (int i = 0; i < n; i++) {
          if (arr[i] % 2 != 0)
             count++;
          while (count > k && start <= i)
             if (arr[start++] % 2 != 0)
                count--;
          if (count == k)
          if (max_len < (i - start + 1))
          max_len = i - start + 1;
       }
       return max_len;
    }
    int main() {
       int arr[] = {2, 3, 4, 11, 4, 12, 7};
       int n = sizeof(arr) / sizeof(arr[0]);
       int k = 1;
       cout << "Maximum Length is: "<< oddSubarrayMaxLength(arr, n, k);
    }

    输出结果

    Maximum Length is: 4