📜  找到恰好有 k 个奇数的最长子数组

📅  最后修改于: 2022-05-13 01:57:50.642000             🧑  作者: Mango

找到恰好有 k 个奇数的最长子数组

给定一个大小为n的数组。问题是找到恰好有k个奇数的最长子数组。
例子:

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}.

朴素方法:考虑所有子数组并计算其中奇数的数量。返回具有恰好“k”个奇数并具有最大长度的长度。时间复杂度为 O(n^2)。
高效方法:这个想法是使用滑动窗口。

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


输出 :

Length = 7

时间复杂度:O(n)。