Given an array which may contain duplicates, print all elements and their frequencies.
Examples:
Input : arr[] = {10, 20, 20, 10, 10, 20, 5, 20}
Output : 10 3
20 4
5 1
Input : arr[] = {10, 20, 20}
Output : 10 1
20 2
A simple solution is to run two loops. For every item count number of times, it occurs. To avoid duplicate printing, keep track of processed items.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
void countFreq( int arr[], int n)
{
vector< bool > visited(n, false );
for ( int i = 0; i < n; i++) {
if (visited[i] == true )
continue ;
int count = 1;
for ( int j = i + 1; j < n; j++) {
if (arr[i] == arr[j]) {
visited[j] = true ;
count++;
}
}
cout << arr[i] << " " << count << endl;
}
}
int main()
{
int arr[] = { 10, 20, 20, 10, 10, 20, 5, 20 };
int n = sizeof (arr) / sizeof (arr[0]);
countFreq(arr, n);
return 0;
}
|
Java
import java.util.Arrays;
class GFG
{
public static void countFreq( int arr[], int n)
{
boolean visited[] = new boolean [n];
Arrays.fill(visited, false );
for ( int i = 0 ; i < n; i++) {
if (visited[i] == true )
continue ;
int count = 1 ;
for ( int j = i + 1 ; j < n; j++) {
if (arr[i] == arr[j]) {
visited[j] = true ;
count++;
}
}
System.out.println(arr[i] + " " + count);
}
}
public static void main(String []args)
{
int arr[] = new int []{ 10 , 20 , 20 , 10 , 10 , 20 , 5 , 20 };
int n = arr.length;
countFreq(arr, n);
}
}
|
Python3
def countFreq(arr, n):
visited = [ False for i in range (n)]
for i in range (n):
if (visited[i] = = True ):
continue
count = 1
for j in range (i + 1 , n, 1 ):
if (arr[i] = = arr[j]):
visited[j] = True
count + = 1
print (arr[i], count)
if __name__ = = '__main__' :
arr = [ 10 , 20 , 20 , 10 , 10 , 20 , 5 , 20 ]
n = len (arr)
countFreq(arr, n)
|
C#
using System;
class GFG
{
public static void countFreq( int []arr, int n)
{
bool []visited = new bool [n];
for ( int i = 0; i < n; i++)
{
if (visited[i] == true )
continue ;
int count = 1;
for ( int j = i + 1; j < n; j++)
{
if (arr[i] == arr[j])
{
visited[j] = true ;
count++;
}
}
Console.WriteLine(arr[i] + " " + count);
}
}
public static void Main(String []args)
{
int []arr = new int []{ 10, 20, 20, 10, 10, 20, 5, 20 };
int n = arr.Length;
countFreq(arr, n);
}
}
|
Javascript
<script>
function countFreq(arr, n)
{
let visited = Array.from({length: n}, (_, i) => false );
for (let i = 0; i < n; i++) {
if (visited[i] == true )
continue ;
let count = 1;
for (let j = i + 1; j < n; j++) {
if (arr[i] == arr[j]) {
visited[j] = true ;
count++;
}
}
document.write(arr[i] + " " + count + "<br/>" );
}
}
let arr = [ 10, 20, 20, 10, 10, 20, 5, 20 ];
let n = arr.length;
countFreq(arr, n);
</script>
|
Complexity Analysis:
- Time Complexity : O(n2)
- Auxiliary Space : O(n)
An efficient solution is to use hashing.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
void countFreq( int arr[], int n)
{
unordered_map< int , int > mp;
for ( int i = 0; i < n; i++)
mp[arr[i]]++;
for ( auto x : mp)
cout << x.first << " " << x.second << endl;
}
int main()
{
int arr[] = { 10, 20, 20, 10, 10, 20, 5, 20 };
int n = sizeof (arr) / sizeof (arr[0]);
countFreq(arr, n);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static void countFreq( int arr[], int n)
{
Map<Integer, Integer> mp = new HashMap<>();
for ( int i = 0 ; i < n; i++)
{
if (mp.containsKey(arr[i]))
{
mp.put(arr[i], mp.get(arr[i]) + 1 );
}
else
{
mp.put(arr[i], 1 );
}
}
for (Map.Entry<Integer, Integer> entry : mp.entrySet())
{
System.out.println(entry.getKey() + " " + entry.getValue());
}
}
public static void main(String args[])
{
int arr[] = { 10 , 20 , 20 , 10 , 10 , 20 , 5 , 20 };
int n = arr.length;
countFreq(arr, n);
}
}
|
Python3
def countFreq(arr, n):
mp = dict ()
for i in range (n):
if arr[i] in mp.keys():
mp[arr[i]] + = 1
else :
mp[arr[i]] = 1
for x in mp:
print (x, " " , mp[x])
arr = [ 10 , 20 , 20 , 10 , 10 , 20 , 5 , 20 ]
n = len (arr)
countFreq(arr, n)
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static void countFreq( int []arr, int n)
{
Dictionary< int , int > mp = new Dictionary< int , int >();
for ( int i = 0; i < n; i++)
{
if (mp.ContainsKey(arr[i]))
{
var val = mp[arr[i]];
mp.Remove(arr[i]);
mp.Add(arr[i], val + 1);
}
else
{
mp.Add(arr[i], 1);
}
}
foreach (KeyValuePair< int , int > entry in mp)
{
Console.WriteLine(entry.Key + " " + entry.Value);
}
}
public static void Main(String []args)
{
int []arr = {10, 20, 20, 10, 10, 20, 5, 20};
int n = arr.Length;
countFreq(arr, n);
}
}
|
Javascript
<script>
function countFreq(arr, n)
{
const map ={}
for (let i = 0; i < n; i++)
{
if (map[arr[i]){
map[arr[i]]+=1
}
else {
map[arr[i]] =1
}
}
console.log(map)
}
var arr = [10, 20, 20, 10, 10, 20, 5, 20];
var n = arr.length;
countFreq(arr, n);
</script>
|
Complexity Analysis:
- Time Complexity : O(n)
- Auxiliary Space : O(n)
In the above efficient solution, how to print elements in same order as they appear in input?
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
void countFreq( int arr[], int n)
{
unordered_map< int , int > mp;
for ( int i = 0; i < n; i++)
mp[arr[i]]++;
for ( int i = 0; i < n; i++) {
if (mp[arr[i]] != -1)
{
cout << arr[i] << " " << mp[arr[i]] << endl;
mp[arr[i]] = -1;
}
}
}
int main()
{
int arr[] = { 10, 20, 20, 10, 10, 20, 5, 20 };
int n = sizeof (arr) / sizeof (arr[0]);
countFreq(arr, n);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static void countFreq( int arr[], int n)
{
Map<Integer, Integer> mp = new HashMap<>();
for ( int i = 0 ; i < n; i++)
{
mp.put(arr[i], mp.get(arr[i]) == null ? 1 : mp.get(arr[i]) + 1 );
}
for ( int i = 0 ; i < n; i++)
{
if (mp.get(arr[i]) != - 1 )
{
System.out.println(arr[i] + " " + mp.get(arr[i]));
mp.put(arr[i], - 1 );
}
}
}
public static void main(String[] args)
{
int arr[] = { 10 , 20 , 20 , 10 , 10 , 20 , 5 , 20 };
int n = arr.length;
countFreq(arr, n);
}
}
|
Python3
def countFreq(arr, n):
mp = {}
for i in range (n):
if arr[i] not in mp:
mp[arr[i]] = 0
mp[arr[i]] + = 1
for i in range (n):
if (mp[arr[i]] ! = - 1 ):
print (arr[i],mp[arr[i]])
mp[arr[i]] = - 1
arr = [ 10 , 20 , 20 , 10 , 10 , 20 , 5 , 20 ]
n = len (arr)
countFreq(arr, n)
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static void countFreq( int []arr, int n)
{
Dictionary< int , int > mp = new Dictionary< int , int >();
for ( int i = 0 ; i < n; i++)
{
if (mp.ContainsKey(arr[i]))
{
var val = mp[arr[i]];
mp.Remove(arr[i]);
mp.Add(arr[i], val + 1);
}
else
{
mp.Add(arr[i], 1);
}
}
for ( int i = 0; i < n; i++)
{
if (mp.ContainsKey(arr[i]) && mp[arr[i]] != -1)
{
Console.WriteLine(arr[i] + " " + mp[arr[i]]);
mp.Remove(arr[i]);
mp.Add(arr[i], -1);
}
}
}
public static void Main(String[] args)
{
int []arr = {10, 20, 20, 10, 10, 20, 5, 20};
int n = arr.Length;
countFreq(arr, n);
}
}
|
Javascript
<script>
function countFreq(arr, n)
{
var mp = new Map();
for ( var i = 0; i < n; i++)
{
if (mp.has(arr[i]))
mp.set(arr[i], mp.get(arr[i])+1)
else
mp.set(arr[i], 1)
}
for ( var i = 0; i < n; i++) {
if (mp.get(arr[i]) != -1)
{
document.write( arr[i] + " " + mp.get(arr[i]) + "<br>" );
mp.set(arr[i], -1);
}
}
}
var arr = [10, 20, 20, 10, 10, 20, 5, 20];
var n = arr.length;
countFreq(arr, n);
</script>
|
Complexity Analysis:
- Time Complexity : O(n)
- Auxiliary Space : O(n)
This problem can be solved in Java using Hashmap. Below is the program.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
void frequencyNumber( int arr[], int size)
{
unordered_map< int , int >freqMap;
for ( int i=0;i<size;i++) {
freqMap[arr[i]]++;
}
for ( auto it : freqMap) {
cout<<it.first<< " " <<it.second<<endl;
}
}
int main()
{
int arr[] = {10, 20, 20, 10, 10, 20, 5, 20};
int size = sizeof (arr)/ sizeof (arr[0]);
frequencyNumber(arr,size);
}
|
Java
import java.io.*;
import java.util.*;
class OccurenceOfNumberInArray {
static void frequencyNumber( int arr[], int size)
{
HashMap<Integer, Integer> freqMap
= new HashMap<Integer, Integer>();
for ( int i= 0 ;i<size;i++) {
if (freqMap.containsKey(arr[i])) {
freqMap.put(arr[i], freqMap.get(arr[i]) + 1 );
}
else {
freqMap.put(arr[i], 1 );
}
}
for (Map.Entry entry : freqMap.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
}
public static void main(String[] args)
{
int arr[] = { 10 , 20 , 20 , 10 , 10 , 20 , 5 , 20 };
int size = arr.length;
frequencyNumber(arr,size);
}
}
|
Python3
def frequencyNumber(arr,size):
freqMap = {}
for i in range (size):
if (arr[i] in freqMap):
freqMap[arr[i]] = freqMap[arr[i]] + 1
else :
freqMap[arr[i]] = 1
for key, value in freqMap.items():
print (f "{key} {value}" )
arr = [ 10 , 20 , 20 , 10 , 10 , 20 , 5 , 20 ]
size = len (arr)
frequencyNumber(arr,size)
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static void frequencyNumber( int []arr, int size)
{
Dictionary< int , int > freqMap = new Dictionary< int , int >();
for ( int i = 0; i < size; i++){
if (freqMap.ContainsKey(arr[i]))
{
var val = freqMap[arr[i]];
freqMap.Remove(arr[i]);
freqMap.Add(arr[i], val + 1);
}
else
{
freqMap.Add(arr[i], 1);
}
}
foreach (KeyValuePair< int , int > entry in freqMap)
{
Console.WriteLine(entry.Key + " " + entry.Value);
}
}
public static void Main(String []args)
{
int []arr = {10, 20, 20, 10, 10, 20, 5, 20};
int size = arr.Length;
frequencyNumber(arr,size);
}
}
|
Javascript
<script>
function frequencyNumber(arr,size)
{
let freqMap
= new Map();
for (let i=0;i<size;i++) {
if (freqMap.has(arr[i])) {
freqMap.set(arr[i], freqMap.get(arr[i]) + 1);
}
else {
freqMap.set(arr[i], 1);
}
}
for (let [key, value] of freqMap.entries()) {
document.write(key + " " + value+ "<br>" );
}
}
let arr=[10, 20, 20, 10, 10, 20, 5, 20];
let size = arr.length;
frequencyNumber(arr,size);
</script>
|
Complexity Analysis:
- Time Complexity: O(n) since using a single loop to track frequency
- Auxiliary Space: O(n) for hashmap.
Another Efficient Solution (Space optimization): we can find frequency of array elements using Binary search function . First we will sort the array for binary search . Our frequency of element will be ‘(last occ – first occ)+1’ of a element in a array .
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void countFreq( int arr[], int n)
{
sort(arr,arr+n);
for ( int i = 0 ; i < n ;i++)
{
int first_index = lower_bound(arr,arr+n,arr[i])- arr;
int last_index = upper_bound(arr,arr+n,arr[i])- arr-1;
i=last_index;
int fre=last_index-first_index+1;
cout << arr[i] << " " <<fre <<endl;
}
}
int main()
{
int arr[] = { 10, 20, 20, 10, 10, 20, 5, 20 };
int n = sizeof (arr) / sizeof (arr[0]);
countFreq(arr, n);
return 0;
}
|
Java
import java.io.*;
import java.util.*;
class OccurenceOfNumberInArray {
public static void countFreq( int [] arr, int n) {
Arrays.sort(arr);
for ( int i = 0 ; i < n; i++) {
int first_index = Arrays.binarySearch(arr, arr[i]);
int last_index = Arrays.binarySearch(arr, arr[i]);
while (first_index > 0 && arr[first_index - 1 ] == arr[i]) {
first_index--;
}
while (last_index < n - 1 && arr[last_index + 1 ] == arr[i]) {
last_index++;
}
i = last_index;
int fre = last_index - first_index + 1 ;
System.out.println(arr[i] + " " + fre);
}
}
public static void main(String[] args)
{
int arr[] = { 10 , 20 , 20 , 10 , 10 , 20 , 5 , 20 };
int size = arr.length;
countFreq(arr,size);
}
}
|
Python3
from bisect import bisect_left, bisect_right
def countFreq(arr, n):
arr.sort()
i = 0
while i < n:
first_index = bisect_left(arr, arr[i])
last_index = bisect_right(arr, arr[i]) - 1
i = last_index + 1
fre = last_index - first_index + 1
print (arr[i - 1 ], fre)
arr = [ 10 , 20 , 20 , 10 , 10 , 20 , 5 , 20 ]
n = len (arr)
countFreq(arr, n)
|
C#
using System;
public class GFG {
public static void countFreq( int [] arr, int n) {
Array.Sort(arr);
for ( int i = 0; i < n; i++) {
int first_index = Array.IndexOf(arr, arr[i]);
int last_index = Array.LastIndexOf(arr, arr[i]);
int fre = last_index - first_index + 1;
Console.WriteLine(arr[i] + " " + fre);
i = last_index;
}
}
static public void Main () {
int [] arr = { 10, 20, 20, 10, 10, 20, 5, 20 };
int n = arr.Length;
countFreq(arr, n);
}
}
|
Javascript
function countFreq(arr,n) {
arr.sort((a, b) => a - b);
let i = 0;
while (i < n) {
const first_index = arr.indexOf(arr[i]);
const last_index = arr.lastIndexOf(arr[i]);
i = last_index;
const fre = last_index - first_index + 1;
console.log(arr[i], fre);
i++;
}
}
const arr = [ 10, 20, 20, 10, 10, 20, 5, 20 ];
countFreq(arr,arr.length);
|
Time Complexity: O(n*log2n) , where O(log2n) time for binary search function .
Auxiliary Space: O(1)
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
03 Oct, 2023
Like Article
Save Article