求具有正k个奇数的最长子数组

给定一个数组的大小 N .问题是要找到最长的子数组 K 奇数。 例如:

null
Input : arr[] = {2, 3, 4, 11, 4, 12, 7}, k = 1Output : 4The sub-array is {4, 11, 4, 12}.Input : arr[] = {3, 4, 6, 1, 9, 8, 2, 10}, k = 2Output : 7The 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 <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>


输出:

Length = 7

时间复杂度:O(n)。

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享