Find the index of the element in an array which divides most elements before it
Last Updated :
23 Feb, 2023
Given an array arr, the task is to find the index of the element in an array which divides most elements before it
Examples:
Input: arr = {5, 2, 1, 4, 5, 8, 2}
Output: 6
Explanation
arr[6] = 2
it divides 2, 4, and 8 (3 elements)
Input: arr = {8, 1, 28, 4, 1, 6, 7}
Output: 4
Approach:
- Maintain a map.
- For each arr[i] update the count variable by looking into map for ar[i] and insert all divisor of ar[i] into map.
- Update maxElement if cnt > maxx.
- Finally return the index with maxElement.
Below is the implementation of above approach:
CPP
#include <bits/stdc++.h>
using namespace std;
int maxElement( int arr[], int n)
{
map< int , int > mp;
int maxx = -1, maxElement = -1;
for ( int i = 0; i < n; i++) {
int num = arr[i];
int cnt = 0;
if (mp.find(num) != mp.end()) {
cnt += mp[num];
}
for ( int j = 1; j * j <= num; j++) {
if (num % j == 0) {
mp[j]++;
if (j != num / j)
mp[num / j]++;
}
}
if (cnt > maxx) {
maxElement = i;
maxx = cnt;
}
}
return maxElement;
}
int main()
{
int arr[] = { 5, 2, 1, 4, 5, 8, 2 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << maxElement(arr, n) << '\n' ;
return 0;
}
|
Java
import java.util.*;
class GFG
{
static int maxElement( int arr[], int n)
{
HashMap<Integer, Integer> mp = new HashMap<Integer, Integer>();
int maxx = - 1 , maxElement = - 1 ;
for ( int i = 0 ; i < n; i++)
{
int num = arr[i];
int cnt = 0 ;
if (mp.containsKey(num))
{
cnt += mp.get(num);
}
for ( int j = 1 ; j * j <= num; j++)
{
if (num % j == 0 )
{
if (mp.containsKey(j))
mp.put(j, mp.get(j) + 1 );
else
mp.put(j, 1 );
if (j != num / j)
if (mp.containsKey(num / j))
mp.put(num / j, mp.get(num / j) + 1 );
else
mp.put(num / j, 1 );
}
}
if (cnt > maxx)
{
maxElement = i;
maxx = cnt;
}
}
return maxElement;
}
public static void main(String[] args)
{
int arr[] = { 5 , 2 , 1 , 4 , 5 , 8 , 2 };
int n = arr.length;
System.out.print(maxElement(arr, n));
}
}
|
Python
def maxElement(arr, n):
mp = dict ()
maxx = - 1
maxElement = - 1
for i in range (n):
num = arr[i]
cnt = 0
if (num in mp):
cnt + = mp[num]
j = 1
while j * j < = num:
if (num % j = = 0 ):
mp[j] = mp.get(j, 0 ) + 1
if (j ! = num / / j):
mp[num / / j] = mp.get(num / / j, 0 ) + 1
j + = 1
if (cnt > maxx):
maxElement = i
maxx = cnt
return maxElement
arr = [ 5 , 2 , 1 , 4 , 5 , 8 , 2 ]
n = len (arr)
print (maxElement(arr, n))
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static int maxElement( int []arr, int n)
{
Dictionary< int , int > mp = new Dictionary< int , int >();
int maxx = -1, maxElement = -1;
for ( int i = 0; i < n; i++)
{
int num = arr[i];
int cnt = 0;
if (mp.ContainsKey(num))
{
cnt += mp[num];
}
for ( int j = 1; j * j <= num; j++)
{
if (num % j == 0)
{
if (mp.ContainsKey(j))
mp[j] = mp[j] + 1;
else
mp.Add(j, 1);
if (j != num / j)
if (mp.ContainsKey(num / j))
mp[num / j] = mp[num / j] + 1;
else
mp.Add(num / j, 1);
}
}
if (cnt > maxx)
{
maxElement = i;
maxx = cnt;
}
}
return maxElement;
}
public static void Main(String[] args)
{
int []arr = { 5, 2, 1, 4, 5, 8, 2 };
int n = arr.Length;
Console.Write(maxElement(arr, n));
}
}
|
Javascript
<script>
function maxElement(arr, n) {
var mp = {};
var maxx = -1,
maxElement = -1;
for ( var i = 0; i < n; i++) {
var num = arr[i];
var cnt = 0;
if (mp.hasOwnProperty(num)) {
cnt += mp[num];
}
for ( var j = 1; j * j <= num; j++) {
if (num % j === 0) {
if (mp.hasOwnProperty(j)) mp[j] = mp[j] + 1;
else mp[j] = 1;
if (j !== num / j)
if (mp.hasOwnProperty(num / j)) mp[num / j] = mp[num / j] + 1;
else mp[num / j] = 1;
}
}
if (cnt > maxx) {
maxElement = i;
maxx = cnt;
}
}
return maxElement;
}
var arr = [5, 2, 1, 4, 5, 8, 2];
var n = arr.length;
document.write(maxElement(arr, n));
</script>
|
Time Complexity: O(N?max(Arr))
Auxiliary Space: O(N) due to map data structure.
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...