Next Greater Frequency Element
Last Updated :
12 Sep, 2025
Given an array arr[], for each element, find the first element to its right that appears more times in the array than the current element. If no such element exists, assign -1.
Examples:
Input: arr[] = [2, 1, 1, 3, 2, 1]
Output: [1, -1, -1, 2, 1, -1]
Explanation: Frequencies: 1 → 3 times, 2 → 2 times, 3 → 1 time.
For arr[0] = 2, the next element 1 has a higher frequency → 1.
For arr[1] and arr[2] (1), no element to the right has a higher frequency → -1.
For arr[3] = 3, the next 2 has a higher frequency → 2.
For arr[4] = 2, the next 1 has a higher frequency → 1.
For arr[5] = 1, no elements to the right → -1.
Input: arr[] = [1, 2, 1]
Output: [-1, 1, -1]
Explanation: Frequencies: 1 → 2, 2 → 1.
2→1 (higher freq), others have no higher freq on right → [-1, 1, -1]
[Naive approach] Frequency Count and Nested Loop - O(n2) Time and O(n) Space
The idea is to find, for each element, the next element to its right that has a higher frequency using a frequency map and a nested loop. If none exists, return -1.
C++
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
vector<int> nextFreqGreater(vector<int>& arr) {
// calculate frequency of each element
// using a hash map (unordered_map).
unordered_map<int, int> freq;
for (int num : arr) {
freq[num]++;
}
vector<int> result;
for (int i = 0; i < arr.size(); i++) {
bool found = false;
// inner loop to find the first element
// with a greater frequency
for (int j = i + 1; j < arr.size(); j++) {
if (freq[arr[j]] > freq[arr[i]]) {
result.push_back(arr[j]);
found = true;
break;
}
}
// if no element with a greater frequency
// is found, push -1
if (!found) {
result.push_back(-1);
}
}
return result;
}
int main() {
vector<int> arr = {2, 1, 1, 3, 2, 1};
vector<int> result = nextFreqGreater(arr);
for (int num : result) {
cout << num << " ";
}
cout << endl;
return 0;
}
Java
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
class GfG {
public static ArrayList<Integer> nextFreqGreater(int[] arr) {
// calculate frequency of
// each element using a hash map.
Map<Integer, Integer> freq = new HashMap<>();
for (int num : arr) {
freq.put(num, freq.getOrDefault(num, 0) + 1);
}
ArrayList<Integer> result = new ArrayList<>();
for (int i = 0; i < arr.length; i++) {
boolean found = false;
// inner loop to find the first
// element with a greater frequency
for (int j = i + 1; j < arr.length; j++) {
if (freq.get(arr[j]) > freq.get(arr[i])) {
result.add(arr[j]);
found = true;
break;
}
}
// if no element with a greater
// frequency is found, set -1
if (!found) {
result.add(-1);
}
}
return result;
}
public static void main(String[] args) {
int[] arr = {2, 1, 1, 3, 2, 1};
ArrayList<Integer> result = nextFreqGreater(arr);
for (int num : result) {
System.out.print(num + " ");
}
System.out.println();
}
}
Python
from collections import Counter
def nextFreqGreater(arr):
# calculate frequency of each
# element using Counter.
freq = Counter(arr)
result = []
for i in range(len(arr)):
found = False
# inner loop to find the first element
# with a greater frequency
for j in range(i + 1, len(arr)):
if freq[arr[j]] > freq[arr[i]]:
result.append(arr[j])
found = True
break
# if no element with a greater frequency
# is found, append -1
if not found:
result.append(-1)
return result
if __name__ == "__main__":
arr = [2, 1, 1, 3, 2, 1]
result = nextFreqGreater(arr)
print(' '.join(map(str, result)))
C#
using System;
using System.Collections.Generic;
class GfG {
public static List<int> nextFreqGreater(int[] arr) {
// calculate frequency of
// each element using a dictionary
Dictionary<int, int> freq = new Dictionary<int, int>();
foreach (int num in arr) {
if (freq.ContainsKey(num)) {
freq[num]++;
} else {
freq[num] = 1;
}
}
List<int> result = new List<int>();
for (int i = 0; i < arr.Length; i++) {
bool found = false;
// inner loop to find the first
// element with a greater frequency
for (int j = i + 1; j < arr.Length; j++) {
if (freq[arr[j]] > freq[arr[i]]) {
result.Add(arr[j]);
found = true;
break;
}
}
// if no element with a greater
// frequency is found, add -1
if (!found) {
result.Add(-1);
}
}
return result;
}
static void Main() {
int[] arr = {2, 1, 1, 3, 2, 1};
List<int> result = nextFreqGreater(arr);
Console.WriteLine(string.Join(" ", result));
}
}
JavaScript
function nextFreqGreater(arr) {
// calculate frequency of
// each element using an object.
const freq = {};
arr.forEach(num => {
freq[num] = (freq[num] || 0) + 1;
});
const result = [];
for (let i = 0; i < arr.length; i++) {
let found = false;
// inner loop to find the first
// element with a greater frequency
for (let j = i + 1; j < arr.length; j++) {
if (freq[arr[j]] > freq[arr[i]]) {
result.push(arr[j]);
found = true;
break;
}
}
// if no element with a greater
// frequency is found, push -1
if (!found) {
result.push(-1);
}
}
return result;
}
// Driver Code
const arr = [2, 1, 1, 3, 2, 1];
const result = nextFreqGreater(arr);
console.log(result.join(' '));
[Efficient Approach] Frequency Counting and Stack - O(n) Time and O(n) Space
The idea is to use a frequency map to count occurrences, then apply a stack-based approach (similar to "Next Greater Element") to efficiently find the next element with a higher frequency for each position. For each element, we compare its frequency with elements tracked in the stack and update the result when a higher frequency is found.
C++
#include <iostream>
#include <stack>
#include <vector>
#include <unordered_map>
using namespace std;
vector<int> nextFreqGreater(vector<int>& arr) {
int n = arr.size();
unordered_map<int, int> freq;
// Building Frequency Map
for (int i = 0; i < arr.size(); ++i) {
freq[arr[i]]++;
}
vector<int> res(n, -1);
stack<int> st;
for (int i = 0; i < n; i++) {
// While current frequency is
// greater than frequency at stack top
while (!st.empty() && freq[arr[i]] >
freq[arr[st.top()]]) {
res[st.top()] = arr[i];
st.pop();
}
st.push(i);
}
return res;
}
int main() {
vector<int> arr = {2, 1, 1, 3, 2, 1};
vector<int> result = nextFreqGreater(arr);
for (int x : result) {
cout << x << " ";
}
return 0;
}
Java
import java.util.Stack;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
class GfG {
public static ArrayList<Integer> nextFreqGreater(int[] arr) {
int n = arr.length;
Map<Integer, Integer> freq = new HashMap<>();
for (int num : arr) {
freq.put(num, freq.getOrDefault(num, 0) + 1);
}
int[] res = new int[n];
Arrays.fill(res, -1);
Stack<Integer> st = new Stack<>();
for (int i = 0; i < n; i++) {
// While current frequency is greater
// than frequency at stack top
while (!st.isEmpty() && freq.get(arr[i]) >
freq.get(arr[st.peek()])) {
res[st.pop()] = arr[i];
}
st.push(i);
}
// Convert array to ArrayList and return
ArrayList<Integer> result = new ArrayList<>();
for (int x : res) {
result.add(x);
}
return result;
}
public static void main(String[] args) {
int[] arr = {2, 1, 1, 3, 2, 1};
ArrayList<Integer> result = nextFreqGreater(arr);
for (int x : result) {
System.out.print(x + " ");
}
}
}
Python
def nextFreqGreater(arr):
n = len(arr)
freq = {}
# Build frequency map
for num in arr:
freq[num] = freq.get(num, 0) + 1
res = [-1] * n
st = []
for i in range(n):
# While current frequency is
# greater than frequency at stack top
while st and freq[arr[i]] > freq[arr[st[-1]]]:
res[st.pop()] = arr[i]
st.append(i)
return res
if __name__ == "__main__":
arr = [2, 1, 1, 3, 2, 1]
result = nextFreqGreater(arr)
print(' '.join(map(str, result)))
C#
using System;
using System.Collections.Generic;
class GfG {
public static List<int> nextFreqGreater(int[] arr) {
int n = arr.Length;
Dictionary<int, int> freq =
new Dictionary<int, int>();
// Build frequency map
foreach (var num in arr) {
if (freq.ContainsKey(num)) freq[num]++;
else freq[num] = 1;
}
int[] res = new int[n];
Array.Fill(res, -1);
Stack<int> st = new Stack<int>();
for (int i = 0; i < n; i++) {
// While current frequency is
// greater than frequency at stack top
while (st.Count > 0 && freq[arr[i]] >
freq[arr[st.Peek()]]) {
res[st.Pop()] = arr[i];
}
st.Push(i);
}
// Convert array to List<int> and return
List<int> result = new List<int>();
foreach (int x in res) {
result.Add(x);
}
return result;
}
static void Main() {
int[] arr = {2, 1, 1, 3, 2, 1};
List<int> result = nextFreqGreater(arr);
Console.WriteLine(string.Join(" ", result));
}
}
JavaScript
function nextFreqGreater(arr) {
let n = arr.length;
let freq = {};
// Build frequency map
for (let num of arr) {
freq[num] = (freq[num] || 0) + 1;
}
let res = new Array(n).fill(-1);
let st = [];
for (let i = 0; i < n; i++) {
// While current frequency is
// greater than frequency at stack top
while (st.length > 0 && freq[arr[i]] >
freq[arr[st[st.length - 1]]]) {
res[st.pop()] = arr[i];
}
st.push(i);
}
return res;
}
// Driver Code
let arr = [2, 1, 1, 3, 2, 1];
let result = nextFreqGreater(arr);
console.log(result.join(' '));
Explore
DSA Fundamentals
Data Structures
Algorithms
Advanced
Interview Preparation
Practice Problem