Find frequency of each element in a limited range array in less than O(n) time
Last Updated :
18 Feb, 2025
Given a sorted array arr[] of positive integers, the task is to find the frequency for each element in the array. Assume all elements in the array are less than some constant M
Note: Do this without traversing the complete array. i.e. expected time complexity is less than O(n)
Examples:
Input: arr[] = [1, 1, 1, 2, 3, 3, 5, 5, 8, 8, 8, 9, 9, 10]
Output:
Element 1 occurs 3 times
Element 2 occurs 1 times
Element 3 occurs 2 times
Element 5 occurs 2 times
Element 8 occurs 3 times
Element 9 occurs 2 times
Element 10 occurs 1 times
Input: arr[] = [2, 2, 6, 6, 7, 7, 7, 11]
Output:
Element 2 occurs 2 times
Element 6 occurs 2 times
Element 7 occurs 3 times
Element 11 occurs 1 times
[Naive Approach - 1] Using Linear Search - O(n) time and O(1) space
To solve the problem follow the below idea:
Traverse the input array and increment the frequency of the element if the current element and the previous element are the same, otherwise reset the frequency and print the element and its frequency
Follow the given steps to solve the problem:
- Initialize frequency to 1 and index to 1.
- Traverse the array from the index position and check if the current element is equal to the previous element.
- If yes, increment the frequency and index and repeat step 2. Otherwise, print the element and its frequency and repeat step 2.
- At last(corner case), print the last element and its frequency.
C++
// C++ program to count number of occurrences of
// each value in the array in O(n) time and O(1) space
#include <bits/stdc++.h>
using namespace std;
void findFrequencies(vector<int> &arr) {
int n = arr.size();
int freq = 1;
int idx = 1;
int value = arr[0];
while (idx < n) {
// check if the current value is equal to
// previous value.
if (arr[idx - 1] == arr[idx]) {
freq++;
idx++;
}
else {
cout << value << " " << freq << endl;
value = arr[idx];
idx++;
// reset the frequency
freq = 1;
}
}
// print the last value and its frequency
cout << value << " " << freq;
}
int main() {
vector<int> arr
= {1, 1, 1, 2, 3, 3, 5, 5, 8, 8, 8, 9, 9, 10};
findFrequencies(arr);
return 0;
}
Java
// Java program to count number of occurrences of
// each value in the array in O(n) time and O(1) space
class GfG {
static void findFrequencies(int[] arr) {
int n = arr.length;
int freq = 1;
int idx = 1;
int value = arr[0];
while (idx < n) {
// check if the current value is equal to
// previous value.
if (arr[idx - 1] == arr[idx]) {
freq++;
idx++;
}
else {
System.out.println(value + " " + freq);
value = arr[idx];
idx++;
// reset the frequency
freq = 1;
}
}
// print the last value and its frequency
System.out.println(value + " " + freq);
}
public static void main(String[] args) {
int[] arr = {1, 1, 1, 2, 3, 3, 5, 5, 8, 8, 8, 9, 9, 10};
findFrequencies(arr);
}
}
Python
# Python program to count number of occurrences of
# each value in the array in O(n) time and O(1) space
def findFrequencies(arr):
n = len(arr)
freq = 1
idx = 1
value = arr[0]
while idx < n:
# check if the current value is equal to
# previous value.
if arr[idx - 1] == arr[idx]:
freq += 1
idx += 1
else:
print(value, freq)
value = arr[idx]
idx += 1
# reset the frequency
freq = 1
# print the last value and its frequency
print(value, freq)
if __name__ == "__main__":
arr = [1, 1, 1, 2, 3, 3, 5, 5, 8, 8, 8, 9, 9, 10]
findFrequencies(arr)
C#
// C# program to count number of occurrences of
// each value in the array in O(n) time and O(1) space
using System;
class GfG {
static void findFrequencies(int[] arr) {
int n = arr.Length;
int freq = 1;
int idx = 1;
int value = arr[0];
while (idx < n) {
// check if the current value is equal to
// previous value.
if (arr[idx - 1] == arr[idx]) {
freq++;
idx++;
}
else {
Console.WriteLine(value + " " + freq);
value = arr[idx];
idx++;
// reset the frequency
freq = 1;
}
}
// print the last value and its frequency
Console.WriteLine(value + " " + freq);
}
static void Main() {
int[] arr = {1, 1, 1, 2, 3, 3, 5, 5, 8, 8, 8, 9, 9, 10};
findFrequencies(arr);
}
}
JavaScript
// JavaScript program to count number of occurrences of
// each value in the array in O(n) time and O(1) space
function findFrequencies(arr) {
let n = arr.length;
let freq = 1;
let idx = 1;
let value = arr[0];
while (idx < n) {
// check if the current value is equal to
// previous value.
if (arr[idx - 1] === arr[idx]) {
freq++;
idx++;
}
else {
console.log(value + " " + freq);
value = arr[idx];
idx++;
// reset the frequency
freq = 1;
}
}
// print the last value and its frequency
console.log(value + " " + freq);
}
let arr = [1, 1, 1, 2, 3, 3, 5, 5, 8, 8, 8, 9, 9, 10];
findFrequencies(arr);
Output1 3
2 1
3 2
5 2
8 3
9 2
10 1
[Expected Approach] Using Binary Search - O(m log(n)) time and O(1) space
The idea is to leverage the sorted nature of the array by using binary search to find the last occurrence of each unique element.
- Starting from the first element, we keep track of its value and use binary search to find the rightmost index where this value appears.
- This gives us the frequency by calculating the difference between the starting and ending indices.
- After finding the frequency of one element, we jump to the next unique element by moving our pointer beyond the last occurrence we found.
Step by step approach:
- Start with index i = 0 and get the current value val = arr[i]
- Use binary search to find the last occurrence (endIndex) of val in the array
- Calculate frequency as (endIndex - i + 1)
- Print the value and its frequency
- Update i to (endIndex + 1) to skip to the next unique element
- Repeat until we reach the end of the array
C++
// C++ program to count number of occurrences of
// each value in the array in O(n) time and O(1) space
#include <bits/stdc++.h>
using namespace std;
// It print number of
// occurrences of each element in the array.
void findFrequencies(vector<int> &arr) {
int n = arr.size();
int i = 0;
while (i<n) {
int val = arr[i];
int s = i, e = n-1;
int endIndex = i;
while (s<=e) {
int mid = s + (e-s)/2;
if (arr[mid] == val) {
endIndex = mid;
s = mid + 1;
}
else {
e = mid - 1;
}
}
int cnt = endIndex - i + 1;
cout << val << " " << cnt << endl;
// Set i to next value index
i = endIndex + 1;
}
}
int main() {
vector<int> arr
= {1, 1, 1, 2, 3, 3, 5, 5, 8, 8, 8, 9, 9, 10};
findFrequencies(arr);
return 0;
}
Java
// Java program to count number of occurrences of
// each value in the array in O(n) time and O(1) space
class GfG {
// It prints number of
// occurrences of each element in the array.
static void findFrequencies(int[] arr) {
int n = arr.length;
int i = 0;
while (i < n) {
int val = arr[i];
int s = i, e = n - 1;
int endIndex = i;
while (s <= e) {
int mid = s + (e - s) / 2;
if (arr[mid] == val) {
endIndex = mid;
s = mid + 1;
}
else {
e = mid - 1;
}
}
int cnt = endIndex - i + 1;
System.out.println(val + " " + cnt);
// Set i to next value index
i = endIndex + 1;
}
}
public static void main(String[] args) {
int[] arr = {1, 1, 1, 2, 3, 3, 5, 5, 8, 8, 8, 9, 9, 10};
findFrequencies(arr);
}
}
Python
# Python program to count number of occurrences of
# each value in the array in O(n) time and O(1) space
# It prints number of
# occurrences of each element in the array.
def findFrequencies(arr):
n = len(arr)
i = 0
while i < n:
val = arr[i]
s, e = i, n - 1
endIndex = i
while s <= e:
mid = s + (e - s) // 2
if arr[mid] == val:
endIndex = mid
s = mid + 1
else:
e = mid - 1
cnt = endIndex - i + 1
print(val, cnt)
# Set i to next value index
i = endIndex + 1
if __name__ == "__main__":
arr = [1, 1, 1, 2, 3, 3, 5, 5, 8, 8, 8, 9, 9, 10]
findFrequencies(arr)
C#
// C# program to count number of occurrences of
// each value in the array in O(n) time and O(1) space
using System;
class GfG {
// It prints number of
// occurrences of each element in the array.
static void findFrequencies(int[] arr) {
int n = arr.Length;
int i = 0;
while (i < n) {
int val = arr[i];
int s = i, e = n - 1;
int endIndex = i;
while (s <= e) {
int mid = s + (e - s) / 2;
if (arr[mid] == val) {
endIndex = mid;
s = mid + 1;
}
else {
e = mid - 1;
}
}
int cnt = endIndex - i + 1;
Console.WriteLine(val + " " + cnt);
// Set i to next value index
i = endIndex + 1;
}
}
static void Main() {
int[] arr = {1, 1, 1, 2, 3, 3, 5, 5, 8, 8, 8, 9, 9, 10};
findFrequencies(arr);
}
}
JavaScript
// JavaScript program to count number of occurrences of
// each value in the array in O(n) time and O(1) space
// It prints number of
// occurrences of each element in the array.
function findFrequencies(arr) {
let n = arr.length;
let i = 0;
while (i < n) {
let val = arr[i];
let s = i, e = n - 1;
let endIndex = i;
while (s <= e) {
let mid = Math.floor(s + (e - s) / 2);
if (arr[mid] === val) {
endIndex = mid;
s = mid + 1;
}
else {
e = mid - 1;
}
}
let cnt = endIndex - i + 1;
console.log(val + " " + cnt);
// Set i to next value index
i = endIndex + 1;
}
}
let arr = [1, 1, 1, 2, 3, 3, 5, 5, 8, 8, 8, 9, 9, 10];
findFrequencies(arr);
Output1 3
2 1
3 2
5 2
8 3
9 2
10 1
Time Complexity: O(m log n). Where m is the number of distinct elements in the array of size n. Since m <= M (a constant) (elements are in a limited range), the time complexity of this solution is O(log N)
Auxiliary Space: O(1)
Similar Reads
Divide and Conquer Algorithm Divide and Conquer algorithm is a problem-solving strategy that involves. Divide : Break the given problem into smaller non-overlapping problems.Conquer : Solve Smaller ProblemsCombine : Use the Solutions of Smaller Problems to find the overall result.Examples of Divide and Conquer are Merge Sort, Q
1 min read
Introduction to Divide and Conquer Algorithm Divide and Conquer Algorithm is a problem-solving technique used to solve problems by dividing the main problem into subproblems, solving them individually and then merging them to find solution to the original problem. Divide and Conquer is mainly useful when we divide a problem into independent su
9 min read
Dynamic Programming vs Divide-and-Conquer In this article Iâm trying to explain the difference/similarities between dynamic programming and divide and conquer approaches based on two examples: binary search and minimum edit distance (Levenshtein distance).The ProblemWhen I started to learn algorithms it was hard for me to understand the mai
12 min read
Decrease and Conquer As divide-and-conquer approach is already discussed, which include following steps: Divide the problem into a number of subproblems that are smaller instances of the same problem. Conquer the sub problems by solving them recursively. If the subproblem sizes are small enough, however, just solve the
5 min read
Advanced master theorem for divide and conquer recurrences The Master Theorem is a tool used to solve recurrence relations that arise in the analysis of divide-and-conquer algorithms. The Master Theorem provides a systematic way of solving recurrence relations of the form: T(n) = aT(n/b) + f(n) where a, b, and f(n) are positive functions and n is the size o
5 min read
Some standard Divide and Conquer Algorithms
Write program to calculate pow(b, e)Given two numbers b and e, the task is to implement a function to compute b^e.Examples: Input: b = 3.00000, e = 5Output: 243.00000Input: b = 0.55000, e = 3Output: 0.16638Input: b = -0.67000, e = -7Output: -16.49971Table of Content[Naive Approach 1] Using Iteration - O(e) Time and O(1) Space[Naive Ap
10 min read
Karatsuba algorithm for fast multiplication using Divide and Conquer algorithmGiven two binary strings that represent value of two integers, find the product of two strings. For example, if the first bit string is "1100" and second bit string is "1010", output should be 120.For simplicity, let the length of two strings be same and be n.A Naive Approach is to follow the proces
15+ min read
Strassen's Matrix MultiplicationGiven two square matrices arr[][] and brr[][] of order n * n. Your task is to multiply both the matrices and find the resultant matrix.Examples:Input: arr[][] = [ [7, 8], [2, 9] ]brr[][] = [ [14, 5], [5, 18] ]Output: [ [138, 179], [73, 172] ]Input: arr[][] = [ [17, 4], [17, 16] ]brr[][] = [ [9, 2],
15+ min read
Convex Hull using Divide and Conquer AlgorithmIn computational geometry, a convex hull is the smallest convex polygon that contains a given set of points. It is a fundamental concept with applications in various fields such as computer graphics, robotics, and image processing. Importance of Convex Hull:Convex hulls are important in computationa
15 min read
Quickhull Algorithm for Convex HullGiven a set of points, a Convex hull is the smallest convex polygon containing all the given points. Input : points[] = {{0, 3}, {1, 1}, {2, 2}, {4, 4}, {0, 0}, {1, 2}, {3, 1}, {3, 3}};Output : The points in convex hull are: (0, 0) (0, 3) (3, 1) (4, 4)Input : points[] = {{0, 3}, {1, 1}Output : Not P
14 min read
Binary Search based problems
Peak Element in ArrayGiven an array arr[] where no two adjacent elements are same, find the index of a peak element. An element is considered to be a peak element if it is strictly greater than its adjacent elements. If there are multiple peak elements, return the index of any one of them.Note: Consider the element befo
12 min read
Check for Majority Element in a sorted arrayGiven an array arr of N elements, A majority element in an array arr of size N is an element that appears more than N/2 times in the array. The task is to write a function say isMajority() that takes an array (arr[] ), arrayâs size (n) and a number to be searched (x) as parameters and returns true i
15+ min read
K-th Element of Merged Two Sorted ArraysGiven two sorted arrays of sizes m and n respectively, the task is to find the element that would be at the k-th position in the final sorted array formed by merging these two arrays.Examples: Input: a[] = [2, 3, 6, 7, 9], b[] = [1, 4, 8, 10], k = 5Output: 6Explanation: The final sorted array is [1,
15+ min read
Find the number of zeroesGiven an array of 1s and 0s which has all 1s first followed by all 0s. Find the number of 0s. Count the number of zeroes in the given array.Examples : Input: arr[] = {1, 1, 1, 1, 0, 0} Output: 2 Input: arr[] = {1, 0, 0, 0, 0} Output: 4 Input: arr[] = {0, 0, 0} Output: 3 Input: arr[] = {1, 1, 1, 1} O
12 min read
Rotation Count in a Rotated Sorted arrayGiven an array arr[] having distinct numbers sorted in increasing order and the array has been right rotated (i.e, the last element will be cyclically shifted to the starting position of the array) k number of times, the task is to find the value of k.Examples: Input: arr[] = {15, 18, 2, 3, 6, 12}Ou
12 min read
Unbounded Binary Search Example (Find the point where a monotonically increasing function becomes positive first time)Given a function 'int f(unsigned int x)' which takes a non-negative integer 'x' as input and returns an integer as output. The function is monotonically increasing with respect to the value of x, i.e., the value of f(x+1) is greater than f(x) for every input x. Find the value 'n' where f() becomes p
11 min read
Median of two Sorted Arrays of Different SizesGiven two sorted arrays, a[] and b[], the task is to find the median of these sorted arrays. Assume that the two sorted arrays are merged and then median is selected from the combined array.This is an extension of Median of two sorted arrays of equal size problem. Here we handle arrays of unequal si
15+ min read
The Painter's Partition Problem using Binary SearchGiven an array arr[] and k, where the array represents the boards and each element of the given array represents the length of each board. k numbers of painters are available to paint these boards. Consider that each unit of a board takes 1 unit of time to paint.The task is to find the minimum time
10 min read
Some practice problems on Divide and Conquer algorithm
Program for Square Root of IntegerGiven a positive integer n, find its square root. If n is not a perfect square, then return floor of ân.Examples : Input: n = 4Output: 2Explanation: The square root of 4 is 2.Input: n = 11Output: 3Explanation: The square root of 11 lies in between 3 and 4 so floor of the square root is 3.Table of Co
11 min read
Maximum and minimum of an array using minimum number of comparisonsGiven an array of size N. The task is to find the maximum and the minimum element of the array using the minimum number of comparisons.Examples:Input: arr[] = {3, 5, 4, 1, 9}Output: Minimum element is: 1 Maximum element is: 9Input: arr[] = {22, 14, 8, 17, 35, 3}Output: Minimum element is: 3 Maximum
15+ min read
Find frequency of each element in a limited range array in less than O(n) timeGiven a sorted array arr[] of positive integers, the task is to find the frequency for each element in the array. Assume all elements in the array are less than some constant MNote: Do this without traversing the complete array. i.e. expected time complexity is less than O(n)Examples: Input: arr[] =
10 min read
Tiling Problem - L ShapedGiven an nÃn board (where n = 2k and kâ¥1), with one missing cell, the task is to fill the remaining cells using L-shaped tiles. An L-shaped tile covers 3 cells in a 2x2 grid, with one cell missing. You need to tile the entire board using the L-shaped tiles, ensuring that the missing cell remains unc
15+ min read
Count Inversions of an ArrayGiven an integer array arr[] of size n, find the inversion count in the array. Two array elements arr[i] and arr[j] form an inversion if arr[i] > arr[j] and i < j.Note: Inversion Count for an array indicates that how far (or close) the array is from being sorted. If the array is already sorted
15+ min read
The Skyline Problem | Set-1Given n rectangular buildings in a 2-dimensional city, compute the skyline of these buildings, eliminating hidden lines. The main task is to view buildings from a side and remove all sections that are not visible. All buildings share a common bottom and every building is represented by a triplet (le
13 min read
Search in a Row-wise and Column-wise Sorted 2D Array using Divide and Conquer algorithmGiven an n x n matrix, where every row and column is sorted in increasing order. Given a key, how to decide whether this key is in the matrix. Input: x = 62, mat[][] = [[3, 30, 38], [20, 52, 54], [35, 60, 69]]Output: falseExplanation: 62 is not present in the matrix.Input: x = 30, mat[][] = [[3, 30]
7 min read
Allocate Minimum PagesGiven an array arr[] and an integer k, where arr[i] denotes the number of pages of a book and k denotes total number of students. All the books need to be allocated to k students in contiguous manner, with each student getting at least one book.The task is to minimize the maximum number of pages all
15+ min read