Find the longest sub-array having exactly k odd numbers
Last Updated :
02 Aug, 2022
Given an array of size n. The problem is to find the longest sub-array having exactly k odd numbers.
Examples:
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}.
Naive Approach: Consider all the sub-arrays and count the number of odd numbers in them. Return the length of the one having exactly ‘k’ odd numbers and has the maximum length. Time Complexity is of O(n^2).
Efficient Approach: The idea is to use sliding window. Create a variable count, which stores the number of odd integers in the current window. If the value of count exceeds K at any point, decrease the window size from the start, otherwise include the element in the current window. Similarly, iterate for the complete array and maintain the maximum value of length of all the windows having exactly k odd numbers in a 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
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int longSubarrWithKOddNum( int arr[], int n,
int k)
{
int max = 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 < (i - start + 1))
max = i - start + 1;
}
return max;
}
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
import java.io.*;
class GFG {
static int longSubarrWithKOddNum( int arr[], int n,
int k)
{
int max = 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 < (i - start + 1 ))
max = i - start + 1 ;
}
return max;
}
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));
}
}
|
Python3
def longSubarrWithKOddNum(arr, n, k) :
mx, count, start = 0 , 0 , 0
for i in range ( 0 , n) :
if (arr[i] % 2 ! = 0 ) :
count = count + 1
while (count > k and start < = i) :
if (arr[start] % 2 ! = 0 ) :
count = count - 1
start = start + 1
if (count = = k) :
if (mx < (i - start + 1 )) :
mx = i - start + 1
return mx
arr = [ 3 , 4 , 6 , 1 , 9 , 8 , 2 , 10 ]
n = len (arr)
k = 2
print ( "Length = " , longSubarrWithKOddNum(arr, n, k))
|
C#
using System;
class GFG {
static int longSubarrWithKOddNum( int []arr, int n,
int k)
{
int max = 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 < (i - start + 1))
max = i - start + 1;
}
return max;
}
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));
}
}
|
PHP
<?php
function longSubarrWithKOddNum( $arr , $n ,
$k )
{
$max = 0; $count = 0; $start = 0;
for ( $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 < ( $i - $start + 1))
$max = $i - $start + 1;
}
return $max ;
}
{
$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;
}
?>
|
Javascript
<script>
function longSubarrWithKOddNum(arr, n, k)
{
var max = 0, count = 0, start = 0;
for ( var 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 < (i - start + 1))
max = i - start + 1;
}
return max;
}
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>
|
Time Complexity: O(n).
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...