Find longest subarray with Prime sum in given Array
Last Updated :
31 Dec, 2022
Given an array arr[], the task is to find the longest subarray whose sum is a prime number.
Examples:
Input: arr[ ] = {1, 4, 2, 1}
Output: 3
Explanation: 4+2+1=7 and 7 is a prime number thus the subarray we get is {4, 2, 1} .
Input: arr[ ] = {5, 2, 11, 4, 7, 19}
Output: 5
Explanation: 5+2+11+4+7=29 and 29 is a prime number thus the subarray we get is {5, 2, 11, 4, 7, 19} .
Approach: This problem can be solved by generating all subarrays and check for each subarray whether the sum is prime or not. For checking prime Sieve of Eratosthenes can be used. Any subarray can have a maximum sum equal to the sum of all the elements of the original array. Follow the steps to solve the given problem.
- Create a variable of total_sum which stores the sum of all the elements in the arr[].
- Do Sieve of Eratosthenes till total_sum because any subarray can’t have a sum greater than that.
- Create a max_sum variable to keep track of the maximum subarray we get while generating all the subarrays.
- Use two loops to find the sum of all the subarrays of arr[] and for each subarray, check whether the sum is prime or not.
- Take maximum among those subarrays whose sum is prime.
- Print max_sum as the required answer.
Below is the implementation of the above approach.
C++
#include <bits/stdc++.h>
using namespace std;
void SieveOfEratosthenes(
vector< bool >& prime, int total_sum)
{
for ( int i = 0; i <= total_sum; i++) {
prime[i] = true ;
}
for ( int p = 2; p * p <= total_sum; p++) {
if (prime[p] == true ) {
for ( int i = p * p; i <= total_sum; i += p)
prime[i] = false ;
}
}
}
int maxLenSubarrayWithSumPrime(
vector< int >& arr, int n)
{
int total_sum = 0;
for ( int i = 0; i < n; i++) {
total_sum += arr[i];
}
vector< bool > prime(total_sum + 1);
SieveOfEratosthenes(prime, total_sum);
int max_sum = 0, cur_sum = 0;
for ( int i = 0; i < n; i++) {
cur_sum = 0;
for ( int j = i; j < n; j++) {
cur_sum += arr[j];
if (prime[cur_sum]) {
max_sum = max(max_sum, j - i + 1);
}
}
}
return max_sum;
}
int main()
{
int n = 6;
vector< int > arr = { 5, 2, 11, 4, 7, 19 };
cout << maxLenSubarrayWithSumPrime(arr, n);
}
|
Java
import java.util.*;
class GFG{
static void SieveOfEratosthenes(
boolean []prime, int total_sum)
{
for ( int i = 0 ; i <= total_sum; i++) {
prime[i] = true ;
}
for ( int p = 2 ; p * p <= total_sum; p++) {
if (prime[p] == true ) {
for ( int i = p * p; i <= total_sum; i += p)
prime[i] = false ;
}
}
}
static int maxLenSubarrayWithSumPrime(
int [] arr, int n)
{
int total_sum = 0 ;
for ( int i = 0 ; i < n; i++) {
total_sum += arr[i];
}
boolean []prime = new boolean [total_sum + 1 ];
SieveOfEratosthenes(prime, total_sum);
int max_sum = 0 , cur_sum = 0 ;
for ( int i = 0 ; i < n; i++) {
cur_sum = 0 ;
for ( int j = i; j < n; j++) {
cur_sum += arr[j];
if (prime[cur_sum]) {
max_sum = Math.max(max_sum, j - i + 1 );
}
}
}
return max_sum;
}
public static void main(String[] args)
{
int n = 6 ;
int []arr = { 5 , 2 , 11 , 4 , 7 , 19 };
System.out.print(maxLenSubarrayWithSumPrime(arr, n));
}
}
|
Python3
from math import sqrt
def SieveOfEratosthenes(prime, total_sum):
for i in range (total_sum + 1 ):
prime[i] = True
for p in range ( 2 , int (sqrt(total_sum)), 1 ):
if (prime[p] = = True ):
for i in range (p * p,total_sum + 1 ,p):
prime[i] = False
def maxLenSubarrayWithSumPrime(arr, n):
total_sum = 0
for i in range (n):
total_sum + = arr[i]
prime = [ False for i in range (total_sum + 1 )]
SieveOfEratosthenes(prime, total_sum)
max_sum = 0
cur_sum = 0
for i in range (n):
cur_sum = 0
for j in range (i,n, 1 ):
cur_sum + = arr[j]
if (prime[cur_sum]):
max_sum = max (max_sum, j - i + 1 )
return max_sum
if __name__ = = '__main__' :
n = 6
arr = [ 5 , 2 , 11 , 4 , 7 , 19 ]
print (maxLenSubarrayWithSumPrime(arr, n))
|
C#
using System;
class GFG {
static void SieveOfEratosthenes( bool [] prime,
int total_sum)
{
for ( int i = 0; i <= total_sum; i++) {
prime[i] = true ;
}
for ( int p = 2; p * p <= total_sum; p++) {
if (prime[p] == true ) {
for ( int i = p * p; i <= total_sum; i += p)
prime[i] = false ;
}
}
}
static int maxLenSubarrayWithSumPrime( int [] arr, int n)
{
int total_sum = 0;
for ( int i = 0; i < n; i++) {
total_sum += arr[i];
}
bool [] prime = new bool [total_sum + 1];
SieveOfEratosthenes(prime, total_sum);
int max_sum = 0, cur_sum = 0;
for ( int i = 0; i < n; i++) {
cur_sum = 0;
for ( int j = i; j < n; j++) {
cur_sum += arr[j];
if (prime[cur_sum]) {
max_sum = Math.Max(max_sum, j - i + 1);
}
}
}
return max_sum;
}
public static void Main( string [] args)
{
int n = 6;
int [] arr = { 5, 2, 11, 4, 7, 19 };
Console.WriteLine(
maxLenSubarrayWithSumPrime(arr, n));
}
}
|
Javascript
<script>
function SieveOfEratosthenes(
prime, total_sum)
{
for (let i = 0; i <= total_sum; i++) {
prime[i] = true ;
}
for (let p = 2; p * p <= total_sum; p++) {
if (prime[p] == true ) {
for (let i = p * p; i <= total_sum; i += p)
prime[i] = false ;
}
}
return prime;
}
function maxLenSubarrayWithSumPrime(
arr, n)
{
let total_sum = 0;
for (let i = 0; i < n; i++) {
total_sum += arr[i];
}
let prime = new Array(total_sum + 1);
prime = SieveOfEratosthenes(prime, total_sum);
let max_sum = 0, cur_sum = 0;
for (let i = 0; i < n; i++) {
cur_sum = 0;
for (let j = i; j < n; j++) {
cur_sum += arr[j];
if (prime[cur_sum]) {
max_sum = Math.max(max_sum, j - i + 1);
}
}
}
return max_sum;
}
let n = 6;
let arr = [5, 2, 11, 4, 7, 19];
document.write(maxLenSubarrayWithSumPrime(arr, n));
</script>
|
Time Complexity: O(S*log(log(S)) + N2), where S and N are the total sum and length of the given array arr[] respectively.
Auxiliary Space: O(S)
Share your thoughts in the comments
Please Login to comment...