Given an array, arr[] of size N and an integer K, the task is to print a subarray of size K whose sum of elements is a prime number. If more than one such subarray exists, then print any one of them.
Examples:
Input: arr[] = {20, 7, 5, 4, 3, 11, 99, 87, 23, 45}, K = 4
Output: 7 5 4 3
Explanation: Sum of the elements of the subarray {7, 5, 4, 3} is 19.
Therefore, the required output is 7 5 4 3.
Input: arr[] = {11, 13, 17}, K = 1
Output: 11
Approach: To solve the problem, the idea is to find the sum of all subarrays of size K using the Sliding Window technique and check if it is prime or not. Follow the steps below to solve the problem.
- Generate all the prime numbers in the range [1, 1000000] using the sieve of Eratosthenes to check if a number is prime or not.
- Initialize a variable, say currSum to store the sum of elements of subarrays of size K.
- Find the sum of the first K elements of the array and store it in currSum.
- Iterate over the remaining array elements one by one, and update currSum by adding the ith element and removing the (i – K)th element from the array. Now, check if currSum is prime or not.
- If currSum is found to be prime, then print all the elements of the current subarray.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void sieve( bool prime[])
{
for ( int i = 0; i < 1000000;
i++) {
prime[i] = true ;
}
prime[0] = prime[1] = false ;
for ( int i = 2; i * i <= 1000000; i++) {
if (prime[i]) {
for ( int j = i * i; j <= 1000000;
j += i) {
prime[j] = false ;
}
}
}
}
void subPrimeSum( int N, int K,
int arr[],
bool prime[])
{
int currSum = 0;
for ( int i = 0; i < K; i++) {
currSum += arr[i];
}
if (prime[currSum]) {
for ( int i = 0; i < K; i++) {
cout << arr[i] << " " ;
}
return ;
}
int st = 1, en = K;
while (en < N) {
currSum += arr[en] - arr[st - 1];
if (prime[currSum]) {
for ( int i = st; i <= en; i++) {
cout << arr[i] << " " ;
}
return ;
}
en++;
st++;
}
}
int main()
{
int arr[] = { 20, 7, 5, 4, 3, 11,
99, 87, 23, 45 };
int K = 4;
int N = sizeof (arr) / sizeof (arr[0]);
bool prime[1000000];
sieve(prime);
subPrimeSum(N, K, arr, prime);
}
|
Java
import java.util.*;
class GFG{
static void sieve( boolean prime[])
{
for ( int i = 0 ; i < 1000000 ; i++)
{
prime[i] = true ;
}
prime[ 0 ] = prime[ 1 ] = false ;
for ( int i = 2 ; i * i <= 1000000 ; i++)
{
if (prime[i])
{
for ( int j = i * i; j < 1000000 ; j += i)
{
prime[j] = false ;
}
}
}
}
static void subPrimeSum( int N, int K,
int arr[],
boolean prime[])
{
int currSum = 0 ;
for ( int i = 0 ; i < K; i++)
{
currSum += arr[i];
}
if (prime[currSum])
{
for ( int i = 0 ; i < K; i++)
{
System.out.print(arr[i] + " " );
}
return ;
}
int st = 1 , en = K;
while (en < N)
{
currSum += arr[en] - arr[st - 1 ];
if (prime[currSum])
{
for ( int i = st; i <= en; i++)
{
System.out.print(arr[i] + " " );
}
return ;
}
en++;
st++;
}
}
public static void main(String[] args)
{
int arr[] = { 20 , 7 , 5 , 4 , 3 , 11 ,
99 , 87 , 23 , 45 };
int K = 4 ;
int N = arr.length;
boolean []prime = new boolean [ 1000000 ];
sieve(prime);
subPrimeSum(N, K, arr, prime);
}
}
|
Python3
def sieve(prime):
for i in range ( 1000000 ):
prime[i] = True
prime[ 0 ] = prime[ 1 ] = False
for i in range ( 2 , 1000 + 1 ):
if (prime[i]):
for j in range (i * i, 1000000 , i):
prime[j] = False
return prime
def subPrimeSum(N, K, arr, prime):
currSum = 0
for i in range ( 0 , K):
currSum + = arr[i]
if (prime[currSum]):
for i in range (K):
print (arr[i], end = " " )
return
st = 1
en = K
while (en < N):
currSum + = arr[en] - arr[st - 1 ]
if (prime[currSum]):
for i in range (st, en + 1 ):
print (arr[i], end = " " )
return
en + = 1
st + = 1
if __name__ = = '__main__' :
arr = [ 20 , 7 , 5 , 4 , 3 ,
11 , 99 , 87 , 23 , 45 ]
K = 4
N = len (arr)
prime = [ False ] * 1000000
prime = sieve(prime)
subPrimeSum(N, K, arr, prime)
|
C#
using System;
class GFG{
static void sieve( bool []prime)
{
for ( int i = 0; i < 1000000; i++)
{
prime[i] = true ;
}
prime[0] = prime[1] = false ;
for ( int i = 2; i * i <= 1000000; i++)
{
if (prime[i])
{
for ( int j = i * i; j < 1000000; j += i)
{
prime[j] = false ;
}
}
}
}
static void subPrimeSum( int N, int K,
int []arr,
bool []prime)
{
int currSum = 0;
for ( int i = 0; i < K; i++)
{
currSum += arr[i];
}
if (prime[currSum])
{
for ( int i = 0; i < K; i++)
{
Console.Write(arr[i] + " " );
}
return ;
}
int st = 1, en = K;
while (en < N)
{
currSum += arr[en] - arr[st - 1];
if (prime[currSum])
{
for ( int i = st; i <= en; i++)
{
Console.Write(arr[i] + " " );
}
return ;
}
en++;
st++;
}
}
public static void Main(String[] args)
{
int []arr = {20, 7, 5, 4, 3, 11,
99, 87, 23, 45};
int K = 4;
int N = arr.Length;
bool []prime = new bool [1000000];
sieve(prime);
subPrimeSum(N, K, arr, prime);
}
}
|
Javascript
<script>
function sieve(prime)
{
for ( var i = 0; i < 1000000;
i++) {
prime[i] = true ;
}
prime[0] = prime[1] = false ;
for ( var i = 2; i * i <= 1000000; i++)
{
if (prime[i])
{
for ( var j = i * i; j <= 1000000;
j += i) {
prime[j] = false ;
}
}
}
}
function subPrimeSum( N, K, arr, prime)
{
var currSum = 0;
for ( var i = 0; i < K; i++) {
currSum += arr[i];
}
if (prime[currSum]) {
for ( var i = 0; i < K; i++) {
document.write(arr[i] + " " );
}
return ;
}
var st = 1, en = K;
while (en < N) {
currSum += arr[en] - arr[st - 1];
if (prime[currSum]) {
for ( var i = st; i <= en; i++) {
document.write(arr[i] + " " );
}
return ;
}
en++;
st++;
}
}
var arr = [ 20, 7, 5, 4, 3, 11,
99, 87, 23, 45 ]
var K = 4;
var N = arr.length;
prime = Array(1000000).fill(0);
sieve(prime);
subPrimeSum(N, K, arr, prime);
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(1)