Given an array arr[] of length N, the task is the find the length of longest subarray of length at least 2 with maximum possible GCD value.
Examples:
Input: arr[] = {1, 2, 2}
Output: 2
Explanation:
Possible sub-arrays of size greater than 2 and there GCD’s are:
1) {1, 2} -> 1
2) {2, 2} -> 2
3) {1, 2, 3} -> 1
Here, the maximum GCD value is 2 and longest sub-array having GCD = 2 is {2, 2}.
Hence the answer is {2, 2}.
Input: arr[] = {18, 3, 6, 9}
Output: 4
Explanation:
Here, the maximum GCD value is 3 and longest sub-array having GCD = 3 is {18, 3, 6, 9}.
Hence the answer is {18, 3, 6, 9}.
Naive Approach: The idea is to generate all the possible subarray of size at least 2 and find the GCD of each subarray of them individually. Then, the length of the subarray with maximum GCD value is the required length.
Time Complexity: O(N2)
Space Complexity: O(1)
Efficient Approach:
- Find the maximum GCD(say g) of all the subarray with length atleast 2 by using the approach discussed in this article.
- Traverse the given array and count the maximum number of consecutive elements which are divisible by GCD g.
Below is the implementation of the above approach:
C++
// C++ program for the above approach #include <bits/stdc++.h> using namespace std; // Function to calculate GCD of two numbers int gcd( int a, int b) { if (b == 0) return a; return gcd(b, a % b); } // Function to find maximum size subarray // having maximum GCD int maximumGcdSubarray( int arr[], int n) { // Base Case if (n == 1) return 0; // Let the maximum GCD be 1 initially int k = 1; // Loop thourgh array to find maximum // GCD of subarray with size 2 for ( int i = 1; i < n; ++i) { k = max(k, gcd(arr[i], arr[i - 1])); } int cnt = 0; int maxLength = 0; // Traverse the array for ( int i = 0; i < n; i++) { // Is a multiple of k, increase cnt if (arr[i] % k == 0) { cnt++; } // Else update maximum length with // consecutive element divisible by k // Set cnt to 0 else { maxLength = max(maxLength, cnt); cnt = 0; } } // Update the maxLength maxLength = max(maxLength, cnt); // Return the maxLength return maxLength; } // Driver Code int main() { int arr[] = { 18, 3, 6, 9 }; int n = sizeof (arr) / sizeof (arr[0]); // Function Call cout << maximumGcdSubarray(arr, n); return 0; } |
Java
// Java program for the above approach class GFG{ // Function to calculate GCD of // two numbers static int gcd( int a, int b) { if (b == 0 ) return a; return gcd(b, a % b); } // Function to find maximum size // subarray having maximum GCD static int maximumGcdSubarray( int arr[], int n) { // Base case if (n == 1 ) return 0 ; // Let the maximum GCD be 1 initially int k = 1 ; // Loop through array to find maximum // GCD of subarray with size 2 for ( int i = 1 ; i < n; i++) { k = Math.max(k, gcd(arr[i], arr[i - 1 ])); } int cnt = 0 ; int maxLength = 0 ; // Traverse the array for ( int i = 0 ; i < n; i++) { // Is a multiple of k, increase cnt if (arr[i] % k == 0 ) { cnt++; } // Else update maximum length with // consecutive element divisible by k // Set cnt to 0 else { maxLength = Math.max(maxLength, cnt); cnt = 0 ; } } // Update the maxLength maxLength = Math.max(maxLength, cnt); // Return the maxLength return maxLength; } // Driver Code public static void main(String args[]) { int arr[] = { 18 , 3 , 6 , 9 }; int n = arr.length; // Function call System.out.println(maximumGcdSubarray(arr, n)); } } // This code is contributed by stutipathak31jan |
Python3
# Python3 program for the above approach # Function to calculate GCD of # two numbers def gcd(a, b): if b = = 0 : return a return gcd(b, a % b) # Function to find maximum size # subarray having maximum GCD def maxGcdSubarray(arr, n): # Base case if n = = 1 : return 0 # Let the maximum GCD be 1 initially k = 1 # Loop through array to find maximum # GCD of subarray with size 2 for i in range ( 1 , n): k = max (k, gcd(arr[i], arr[i - 1 ])) cnt = 0 maxLength = 0 # Traverse the array for i in range (n): # Is a multiple of k, increase cnt if arr[i] % k = = 0 : cnt + = 1 # Else update maximum length with # consecutive element divisible by k # Set cnt to 0 else : maxLength = max (maxLength, cnt) cnt = 0 # Update the maxLength maxLength = max (maxLength, cnt) # Return the maxLength return maxLength # Driver Code arr = [ 18 , 3 , 6 , 9 ] n = len (arr) # Function call print (maxGcdSubarray(arr, n)) # This code is contributed by stutipathak31jan |
C#
// C# program for the above approach using System; using System.Collections.Generic; class GFG{ // Function to calculate GCD of // two numbers static int gcd( int a, int b) { if (b == 0) return a; return gcd(b, a % b); } // Function to find maximum size // subarray having maximum GCD static int maximumGcdSubarray( int [] arr, int n) { // Base case if (n == 1) return 0; // Let the maximum GCD be 1 initially int k = 1; // Loop through array to find maximum // GCD of subarray with size 2 for ( int i = 1; i < n; i++) { k = Math.Max(k, gcd(arr[i], arr[i - 1])); } int cnt = 0; int maxLength = 0; // Traverse the array for ( int i = 0; i < n; i++) { // Is a multiple of k, increase cnt if (arr[i] % k == 0) { cnt++; } // Else update maximum length with // consecutive element divisible by k // Set cnt to 0 else { maxLength = Math.Max(maxLength, cnt); cnt = 0; } } // Update the maxLength maxLength = Math.Max(maxLength, cnt); // Return the maxLength return maxLength; } // Driver code static void Main() { int [] arr = { 18, 3, 6, 9 }; int n = arr.Length; // Function call Console.WriteLine(maximumGcdSubarray(arr, n)); } } // This code is contributed by divyeshrabadiya07 |
Javascript
<script> // Javascript program for the above approach // Function to calculate GCD of two numbers function gcd(a, b) { if (b == 0) return a; return gcd(b, a % b); } // Function to find maximum size subarray // having maximum GCD function maximumGcdSubarray(arr, n) { // Base Case if (n == 1) return 0; // Let the maximum GCD be 1 initially let k = 1; // Loop thourgh array to find maximum // GCD of subarray with size 2 for (let i = 1; i < n; ++i) { k = Math.max(k, gcd(arr[i], arr[i - 1])); } let cnt = 0; let maxLength = 0; // Traverse the array for (let i = 0; i < n; i++) { // Is a multiple of k, increase cnt if (arr[i] % k == 0) { cnt++; } // Else update maximum length with // consecutive element divisible by k // Set cnt to 0 else { maxLength = Math.max(maxLength, cnt); cnt = 0; } } // Update the maxLength maxLength = Math.max(maxLength, cnt); // Return the maxLength return maxLength; } // Driver Code let arr = [ 18, 3, 6, 9 ]; let n = arr.length; // Function Call document.write(maximumGcdSubarray(arr, n)); // This code is contributed by Mayank Tyagi </script> |
4
Time Complexity: O(N), where N is the length of the array.
Auxiliary Space: O(log(max(a, b)))
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!