Encuentre el subarreglo más largo que tenga exactamente k números impares

Dada una array de tamaño n . El problema es encontrar el subarreglo más largo que tenga exactamente k números impares.
Ejemplos: 
 

Input : arr[] = {2, 3, 4, 11, 4, 12, 7}, k = 1
Output : 4
The sub-array is {4, 11, 4, 12}.

Input : arr[] = {3, 4, 6, 1, 9, 8, 2, 10}, k = 2
Output : 7
The sub-array is {4, 6, 1, 9, 8, 2, 10}.

Enfoque ingenuo: considere todos los subconjuntos y cuente la cantidad de números impares en ellos. Devuelve la longitud del que tiene exactamente ‘k’ números impares y tiene la longitud máxima. La complejidad del tiempo es de O (n ^ 2).
Enfoque Eficiente: La idea es utilizar ventana corrediza . Cree un conteo variable, que almacena el número de enteros impares en la ventana actual. Si el valor de count excede K en algún punto, reduzca el tamaño de la ventana desde el principio; de lo contrario, incluya el elemento en la ventana actual. De manera similar, iterar para la array completa y mantener el valor máximo de longitud de todas las ventanas que tienen exactamente k números impares en una variable max. 
 

longSubarrWithKOddNum(arr, n, k)
    Initialize max = 0, count = 0, start = 0

    for i = 0 to n-1
        if arr[i] % 2 != 0, then
        count++
    while (count > k && start <= i)    
        if arr[start++] % 2 != 0, then
            count--
    if count == k, then
        if max < (i - start + 1), then
            max = i - start + 1    
    return max

C++

// C++ implementation to find the longest
// sub-array having exactly k odd numbers
#include <bits/stdc++.h>
using namespace std;
 
// function to find the longest sub-array
// having exactly k odd numbers
int longSubarrWithKOddNum(int arr[], int n,
                                     int k)
{
    int max = 0, count = 0, start = 0;
     
    // traverse the given array
    for (int i = 0; i < n; i++) {
        // if number is odd increment count
        if (arr[i] % 2 != 0)
            count++;
         
        // remove elements from sub-array from
        // 'start' index when count > k
        while (count > k && start <= i)   
            if (arr[start++] % 2 != 0)
                count--;
         
        // if count == k, then compare max with
        // current sub-array length
        if (count == k)
            if (max < (i - start + 1))
                max = i - start + 1;
    }
     
    // required length
    return max;
}
 
// Driver program to test above
int main()
{
    int arr[] = {3, 4, 6, 1, 9, 8, 2, 10};
    int n = sizeof(arr) / sizeof(arr[0]);
    int k = 2;
     
    cout << "Length = "
         << longSubarrWithKOddNum(arr, n, k);
          
    return 0;    
}

Java

// Java implementation to find the longest
// sub-array having exactly k odd numbers
import java.io.*;
 
class GFG {
     
    // function to find the longest sub-array
    // having exactly k odd numbers
    static int longSubarrWithKOddNum(int arr[], int n,
                                        int k)
    {
        int max = 0, count = 0, start = 0;
         
        // traverse the given array
        for (int i = 0; i < n; i++)
        {
            // if number is odd increment count
            if (arr[i] % 2 != 0)
                count++;
             
            // remove elements from sub-array from
            // 'start' index when count > k
            while (count > k && start <= i)
                if (arr[start++] % 2 != 0)
                    count--;
             
            // if count == k, then compare max
            // with current sub-array length
            if (count == k)
                if (max < (i - start + 1))
                    max = i - start + 1;
        }
         
        // required length
        return max;
    }
 
    // Driver program
    public static void main(String args[])
    {
        int arr[] = {3, 4, 6, 1, 9, 8, 2, 10};
        int n = arr.length;
        int k = 2;
     
        System.out.println("Length = "
                          + longSubarrWithKOddNum(arr, n, k));
    }
}
 
 
// This code is contributed
// by Nikita Tiwari.

Python3

# Python3 implementation to find the longest
# sub-array having exactly k odd numbers
 
# Function to find the longest sub-array
# having exactly k odd numbers
def longSubarrWithKOddNum(arr, n, k) :
     
    mx, count, start = 0, 0, 0
 
    # Traverse the given array
    for i in range(0, n) :
         
        # if number is odd increment count
        if (arr[i] % 2 != 0) :
            count = count + 1
             
        # remove elements from sub-array from
        # 'start' index when count > k
        while (count > k and start <= i) :
             
            if (arr[start] % 2 != 0) :
                count = count - 1
                 
            start = start + 1
         
        # if count == k, then compare max 
        # with current sub-array length
        if (count == k) :
            if (mx < (i - start + 1)) :
                mx = i - start + 1
     
    # required length
    return mx
     
 
# Driver Code
arr = [3, 4, 6, 1, 9, 8, 2, 10]
n = len(arr)
k = 2
 
print("Length = ", longSubarrWithKOddNum(arr, n, k))
 
# This code is contributed by Nikita Tiwari.

C#

// C# implementation to find the longest
// sub-array having exactly k odd numbers
using System;
 
class GFG {
     
    // function to find the longest sub-array
    // having exactly k odd numbers
    static int longSubarrWithKOddNum(int []arr, int n,
                                                int k)
    {
        int max = 0, count = 0, start = 0;
         
        // traverse the given array
        for (int i = 0; i < n; i++)
        {
            // if number is odd increment count
            if (arr[i] % 2 != 0)
                count++;
             
            // remove elements from sub-array from
            // 'start' index when count > k
            while (count > k && start <= i)
                if (arr[start++] % 2 != 0)
                    count--;
             
            // if count == k, then compare max
            // with current sub-array length
            if (count == k)
                if (max < (i - start + 1))
                    max = i - start + 1;
        }
         
        // required length
        return max;
    }
 
    // Driver program
    public static void Main()
    {
        int []arr = {3, 4, 6, 1, 9, 8, 2, 10};
        int n = arr.Length;
        int k = 2;
     
        Console.WriteLine("Length = "
                        + longSubarrWithKOddNum(arr, n, k));
    }
}
 
 
// This code is contributed
// by vt_m.

PHP

<?php
// PHP implementation to find the longest
// sub-array having exactly k odd numbers
 
// function to find the longest sub-array
// having exactly k odd numbers
function longSubarrWithKOddNum($arr, $n,
                                    $k)
{
    $max = 0; $count = 0; $start = 0;
     
    // traverse the given array
    for ($i = 0; $i < $n; $i++)
    {
         
        // if number is odd increment count
        if ($arr[$i] % 2 != 0)
            $count++;
         
        // remove elements from sub-array from
        // 'start' index when count > k
        while ($count > $k && $start <= $i)
            if ($arr[$start++] % 2 != 0)
                $count--;
         
        // if count == k, then compare max with
        // current sub-array length
        if ($count == $k)
            if ($max < ($i - $start + 1))
                $max = $i - $start + 1;
    }
     
    // required length
    return $max;
}
 
// Driver Code
{
    $arr = array(3, 4, 6, 1, 9, 8, 2, 10);
    $n = sizeof($arr) / sizeof($arr[0]);
    $k = 2;
     
    echo "Length = ", longSubarrWithKOddNum($arr, $n, $k);
    return 0;    
}
 
// This code is contributed by nitin mittal.
?>

Javascript

<script>
 
// Javascript implementation to find the longest
// sub-array having exactly k odd numbers
 
// function to find the longest sub-array
// having exactly k odd numbers
function longSubarrWithKOddNum(arr, n, k)
{
    var max = 0, count = 0, start = 0;
     
    // traverse the given array
    for (var i = 0; i < n; i++) {
        // if number is odd increment count
        if (arr[i] % 2 != 0)
            count++;
         
        // remove elements from sub-array from
        // 'start' index when count > k
        while (count > k && start <= i)   
            if (arr[start++] % 2 != 0)
                count--;
         
        // if count == k, then compare max with
        // current sub-array length
        if (count == k)
            if (max < (i - start + 1))
                max = i - start + 1;
    }
     
    // required length
    return max;
}
 
// Driver program to test above
var arr = [3, 4, 6, 1, 9, 8, 2, 10];
var n = arr.length;
var k = 2;
 
document.write( "Length = "
     +  longSubarrWithKOddNum(arr, n, k));
 
 
</script>

Producción : 
 

Length = 7

Complejidad temporal: O(n).
 

Publicación traducida automáticamente

Artículo escrito por ayushjauhari14 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *