Maximum GCD of all subarrays of length at least 2 - GeeksforGeeks

21 Nov, 2021
Given an array arr[] of N numbers. The task is to find the maximum GCD of all subarrays of size greater than 1. Examples:  
Input: arr[] = { 3, 18, 9, 9, 5, 15, 8, 7, 6, 9 } Output: 9 Explanation: GCD of the subarray {18, 9, 9} is maximum which is 9.Input: arr[] = { 4, 8, 12, 16, 20, 24 } Output: 4 Explanation: GCD of the subarray {4, 18, 12, 16, 20, 24} is maximum which is 4.  
 
Naive Approach: The idea is to generate all the subarray of size greater than 1 and then find the maximum of gcd of all subarray formed. Time complexity: O(N2) Efficient Approach: Let GCD of two numbers be g. Now if we take gcd of g with any third number say c then, gcd will decrease or remain same, but it will never increase. The idea is to find gcd of every consecutive pair in the arr[] and the maximum of gcd of all the pairs formed is the desired result.Below is the implementation of the above approach:  
C++
Java
Python3
C#
Javascript
// C++ program for the above approach #include <bits/stdc++.h>using namespace std; // Function to find GCDint gcd(int a, int b){    if (b == 0) {        return a;    }    return gcd(b, a % b);} void findMaxGCD(int arr[], int n){     // To store the maximum GCD    int maxGCD = 0;     // Traverse the array    for (int i = 0; i < n - 1; i++) {         // Find GCD of the consecutive        // element        int val = gcd(arr[i], arr[i + 1]);         // If calculated GCD > maxGCD        // then update it        if (val > maxGCD) {            maxGCD = val;        }    }     // Print the maximum GCD    cout << maxGCD << endl;} // Driver Codeint main(){    int arr[] = { 3, 18, 9, 9, 5,                  15, 8, 7, 6, 9 };     int n = sizeof(arr) / sizeof(arr[0]);     // Function Call    findMaxGCD(arr, n);    return 0;}
// Java program for the above approachimport java.util.*; class GFG{ // Function to find GCDstatic int gcd(int a, int b){    if (b == 0)    {        return a;    }    return gcd(b, a % b);} static void findMaxGCD(int arr[], int n){     // To store the maximum GCD    int maxGCD = 0;     // Traverse the array    for(int i = 0; i < n - 1; i++)    {                // Find GCD of the consecutive       // element       int val = gcd(arr[i], arr[i + 1]);               // If calculated GCD > maxGCD       // then update it       if (val > maxGCD)       {           maxGCD = val;       }    }     // Print the maximum GCD    System.out.print(maxGCD + "\n");} // Driver Codepublic static void main(String[] args){    int arr[] = { 3, 18, 9, 9, 5,                  15, 8, 7, 6, 9 };    int n = arr.length;     // Function call    findMaxGCD(arr, n);}} // This code is contributed by amal kumar choubey
# Python3 program for the above approach # Function to find GCDdef gcd(a, b):         if (b == 0):        return a;    return gcd(b, a % b); def findMaxGCD(arr, n):         # To store the maximum GCD    maxGCD = 0;     # Traverse the array    for i in range(0, n - 1):         # Find GCD of the consecutive        # element        val = gcd(arr[i], arr[i + 1]);         # If calculated GCD > maxGCD        # then update it        if (val > maxGCD):            maxGCD = val;     # Print the maximum GCD    print(maxGCD); # Driver Codeif __name__ == '__main__':         arr = [ 3, 18, 9, 9, 5,            15, 8, 7, 6, 9 ];    n = len(arr);     # Function call    findMaxGCD(arr, n); # This code is contributed by 29AjayKumar
// C# program for the above approachusing System; class GFG{ // Function to find GCDstatic int gcd(int a, int b){    if (b == 0)    {        return a;    }    return gcd(b, a % b);} static void findMaxGCD(int []arr, int n){     // To store the maximum GCD    int maxGCD = 0;     // Traverse the array    for(int i = 0; i < n - 1; i++)    {                 // Find GCD of the consecutive        // element        int val = gcd(arr[i], arr[i + 1]);                     // If calculated GCD > maxGCD        // then update it        if (val > maxGCD)        {            maxGCD = val;        }    }     // Print the maximum GCD    Console.Write(maxGCD + "\n");} // Driver Codepublic static void Main(){    int []arr = { 3, 18, 9, 9, 5,                 15, 8, 7, 6, 9 };    int n = arr.Length;     // Function call    findMaxGCD(arr, n);}} // This code is contributed by Code_Mech
<script> // Javascript program for the above approach // Function to find GCDfunction gcd(a, b){    if (b == 0) {        return a;    }    return gcd(b, a % b);} function findMaxGCD(arr, n){     // To store the maximum GCD    let maxGCD = 0;     // Traverse the array    for (let i = 0; i < n - 1; i++) {         // Find GCD of the consecutive        // element        let val = gcd(arr[i], arr[i + 1]);         // If calculated GCD > maxGCD        // then update it        if (val > maxGCD) {            maxGCD = val;        }    }     // Print the maximum GCD    document.write(maxGCD + "<br>");} // Driver Code      let arr = [ 3, 18, 9, 9, 5,                15, 8, 7, 6, 9 ];     let n = arr.length;     // Function Call    findMaxGCD(arr, n); // This code is contributed by Mayank Tyagi </script>
9
 
Time Complexity: O(N), where N is the length of the array.
Auxiliary Space: O(log(max(a, b))) 
Amal Kumar Choubey
Code_Mech
29AjayKumar
mayanktyagi1709
rishavmahato348
GCD-LCM
subarray
Aptitude
Arrays
Mathematical
Arrays
Mathematical
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Puzzle | How much money did the man have before entering the bank?
7 Best Tips to Prepare for Aptitude Test For Campus Placements
Puzzle | Splitting a Cake with a Missing Piece in two equal portion
Geometry and Co-ordinates
Program to find the last two digits of x^y
Arrays in Java
Arrays in C/C++
Program for array rotation
Stack Data Structure (Introduction and Program)
Top 50 Array Coding Problems for Interviews