Largest subarray with GCD one
Last Updated :
07 Jul, 2022
There is an array with n elements. Find length of the largest subarray having GCD equal to 1. If no subarray with GCD 1, then print -1.
Examples :
Input : 1 3 5
Output : 3
Input : 2 4 6
Output :-1
A simple solution is to consider every subarray and find its GCD and keep track of largest subarray with GCD one. Finally return length of the largest subarray with GCD 1.
An efficient solution is based on fact that if any two elements have GCD equals to one, then whole array has GCD one. So the output is either -1 or length of array.
C++
#include<bits/stdc++.h>
using namespace std;
int findLargest( int arr[], int n)
{
int gcd = arr[0];
for ( int i=1; i<n; i++)
gcd = __gcd(gcd, arr[i]);
return (gcd == 1)? n : -1;
}
int main()
{
int arr[] = {1, 3, 5, 7};
int n = sizeof (arr)/ sizeof ( int );
cout << "Length of the largest subarray = "
<< findLargest(arr, n);
return 0;
}
|
Java
class GFG {
static int ___gcd( int a, int b)
{
if (a == 0 || b == 0 )
return 0 ;
if (a == b)
return a;
if (a > b)
return ___gcd(a - b, b);
return ___gcd(a, b - a);
}
static int findLargest( int arr[],
int n)
{
int gcd = arr[ 0 ];
for ( int i = 1 ; i < n; i++)
gcd = ___gcd(gcd, arr[i]);
return (gcd == 1 )? n : - 1 ;
}
public static void main (String[] args)
{
int arr[] = { 1 , 3 , 5 , 7 };
int n = arr.length;
System.out.print( "Length of the "
+ "largest subarray = "
+ findLargest(arr, n));
}
}
|
Python3
def ___gcd(a,b):
if (a = = 0 or b = = 0 ):
return 0
if (a = = b):
return a
if (a > b):
return ___gcd(a - b, b)
return ___gcd(a, b - a)
def findLargest(arr, n):
gcd = arr[ 0 ]
for i in range ( 1 ,n):
gcd = ___gcd(gcd, arr[i])
return n if (gcd = = 1 ) else - 1
arr = [ 1 , 3 , 5 , 7 ]
n = len (arr)
print ( "Length of the largest subarray = " ,
findLargest(arr, n))
|
C#
using System;
class GFG {
static int ___gcd( int a, int b)
{
if (a == 0 || b == 0)
return 0;
if (a == b)
return a;
if (a > b)
return ___gcd(a - b, b);
return ___gcd(a, b - a);
}
static int findLargest( int []arr,
int n)
{
int gcd = arr[0];
for ( int i = 1; i < n; i++)
gcd = ___gcd(gcd, arr[i]);
return (gcd == 1)? n : -1;
}
public static void Main ()
{
int []arr = {1, 3, 5, 7};
int n = arr.Length;
Console.Write( "Length of the "
+ "largest subarray = "
+ findLargest(arr, n));
}
}
|
PHP
<?php
function ___gcd( $a , $b )
{
if ( $a == 0 || $b == 0)
return 0;
if ( $a == $b )
return $a ;
if ( $a > $b )
return ___gcd( $a - $b , $b );
return ___gcd( $a , $b - $a );
}
function findLargest( $arr , $n )
{
$gcd = $arr [0];
for ( $i = 1; $i < $n ; $i ++)
$gcd = ___gcd( $gcd , $arr [ $i ]);
return ( $gcd == 1)? $n : -1;
}
$arr = array (1, 3, 5, 7);
$n = count ( $arr );
echo "Length of the " .
"largest subarray = " .
findLargest( $arr , $n );
?>
|
Javascript
<script>
function ___gcd(a, b)
{
if (a == 0 || b == 0)
return 0;
if (a == b)
return a;
if (a > b)
return ___gcd(a - b, b);
return ___gcd(a, b - a);
}
function findLargest(arr, n)
{
let gcd = arr[0];
for (let i = 1; i < n; i++)
gcd = ___gcd(gcd, arr[i]);
return (gcd == 1)? n : -1;
}
let arr = [1, 3, 5, 7];
let n = arr.length;
document.write( "Length of the "
+ "largest subarray = "
+ findLargest(arr, n));
</script>
|
Output
Length of the largest subarray = 4
Time Complexity: O(log(min(n)))
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...