Length of largest sub-array having primes strictly greater than non-primes
Given an array ‘arr’ of length ‘n’. The task is to find the largest contiguous sub-array having the count of prime numbers strictly greater than the count of non-prime numbers.
Examples:
Input: arr[] = {4, 7, 4, 7, 11, 5, 4, 4, 4, 5}
Output: 9
Input: arr[] = { 1, 9, 3, 4, 5, 6, 7, 8 }
Output: 5
Approach: To find the largest subarray in which count of prime is strictly greater than the count of non-prime:
First of all, use sieve to find the prime number.
Replace all primes with 1 in the array and all non-primes with -1. Now this problem is similar to Longest subarray having count of 1s one more than count of 0s
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
bool prime[1000000 + 5];
void findPrime()
{
memset (prime, true , sizeof (prime));
prime[1] = false ;
for ( int p = 2; p * p <= 1000000; p++) {
if (prime[p] == true ) {
for ( int i = p * 2; i <= 1000000; i += p)
prime[i] = false ;
}
}
}
int lenOfLongSubarr( int arr[], int n)
{
unordered_map< int , int > um;
int sum = 0, maxLen = 0;
for ( int i = 0; i < n; i++) {
sum += prime[arr[i]] == 0 ? -1 : 1;
if (sum == 1)
maxLen = i + 1;
else if (um.find(sum) == um.end())
um[sum] = i;
if (um.find(sum - 1) != um.end()) {
if (maxLen < (i - um[sum - 1]))
maxLen = i - um[sum - 1];
}
}
return maxLen;
}
int main()
{
findPrime();
int arr[] = { 1, 9, 3, 4, 5, 6, 7, 8 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << lenOfLongSubarr(arr, n) << endl;
return 0;
}
|
Java
import java.util.*;
class GfG {
static boolean prime[] = new boolean [ 1000000 + 5 ];
static void findPrime()
{
Arrays.fill(prime, true );
prime[ 1 ] = false ;
for ( int p = 2 ; p * p <= 1000000 ; p++) {
if (prime[p] == true ) {
for ( int i = p * 2 ; i <= 1000000 ; i += p)
prime[i] = false ;
}
}
}
static int lenOfLongSubarr( int arr[], int n)
{
Map<Integer, Integer> um = new HashMap<Integer, Integer>();
int sum = 0 , maxLen = 0 ;
for ( int i = 0 ; i < n; i++) {
sum += prime[arr[i]] == false ? - 1 : 1 ;
if (sum == 1 )
maxLen = i + 1 ;
else if (!um.containsKey(sum))
um.put(sum, i);
if (um.containsKey(sum - 1 )) {
if (maxLen < (i - um.get(sum - 1 )))
maxLen = i - um.get(sum - 1 );
}
}
return maxLen;
}
public static void main(String[] args)
{
findPrime();
int arr[] = { 1 , 9 , 3 , 4 , 5 , 6 , 7 , 8 };
int n = arr.length;
System.out.println(lenOfLongSubarr(arr, n));
}
}
|
Python3
prime = [ True ] * ( 1000000 + 5 )
def findPrime():
prime[ 0 ], prime[ 1 ] = False , False
for p in range ( 2 , 1001 ):
if prime[p] = = True :
for i in range (p * 2 , 1000001 , p):
prime[i] = False
def lenOfLongSubarr(arr, n):
um = {}
Sum , maxLen = 0 , 0
for i in range ( 0 , n):
Sum = Sum - 1 if prime[arr[i]] = = False else Sum + 1
if Sum = = 1 :
maxLen = i + 1
elif Sum not in um:
um[ Sum ] = i
if ( Sum - 1 ) in um:
if maxLen < (i - um[ Sum - 1 ]):
maxLen = i - um[ Sum - 1 ]
return maxLen
if __name__ = = "__main__" :
findPrime()
arr = [ 1 , 9 , 3 , 4 , 5 , 6 , 7 , 8 ]
n = len (arr)
print (lenOfLongSubarr(arr, n))
|
C#
using System;
using System.Collections.Generic;
class GfG {
static bool [] prime = new bool [1000000 + 5];
static void findPrime()
{
Array.Fill(prime, true );
prime[1] = false ;
for ( int p = 2; p * p <= 1000000; p++) {
if (prime[p] == true ) {
for ( int i = p * 2; i <= 1000000; i += p)
prime[i] = false ;
}
}
}
static int lenOfLongSubarr( int [] arr, int n)
{
Dictionary< int , int > um = new Dictionary< int , int >();
int sum = 0, maxLen = 0;
for ( int i = 0; i < n; i++) {
sum += prime[arr[i]] == false ? -1 : 1;
if (sum == 1)
maxLen = i + 1;
else if (!um.ContainsKey(sum))
um[sum] = i;
if (um.ContainsKey(sum - 1)) {
if (maxLen < (i - um[sum - 1]))
maxLen = i - um[sum - 1];
}
}
return maxLen;
}
public static void Main()
{
findPrime();
int [] arr = { 1, 9, 3, 4, 5, 6, 7, 8 };
int n = arr.Length;
Console.WriteLine(lenOfLongSubarr(arr, n));
}
}
|
Javascript
<script>
let prime = new Array(1000000 + 5);
function findPrime() {
prime.fill( true )
prime[1] = false ;
for (let p = 2; p * p <= 1000000; p++) {
if (prime[p] == true ) {
for (let i = p * 2; i <= 1000000; i += p)
prime[i] = false ;
}
}
}
function lenOfLongSubarr(arr, n) {
let um = new Map();
let sum = 0, maxLen = 0;
for (let i = 0; i < n; i++) {
sum += prime[arr[i]] == 0 ? -1 : 1;
if (sum == 1)
maxLen = i + 1;
else if (!um.has(sum))
um.set(sum, i);
if (um.has(sum - 1)) {
if (maxLen < (i - um.get(sum - 1)))
maxLen = i - um.get(sum - 1);
}
}
return maxLen;
}
findPrime();
let arr = [1, 9, 3, 4, 5, 6, 7, 8];
let n = arr.length;
document.write(lenOfLongSubarr(arr, n) + "<br>" )
</script>
|
Time Complexity: O(P*log(log(P)) + N), where P is the upper range up to which prime numbers are needed to be calculated during preprocessing and N is the length of the given array.
Auxiliary Space: O(P + N), where P is the hardcoded length of the prime array (1000000 + 5).
Last Updated :
16 Nov, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...