Table of Contents
Problem Statement
In the “Count Number of Occurrences in a Sorted Array” problem, we have given a sorted array. Count the number of occurrences or frequency in a sorted array of X where X is an integer.
Example
Input
13
1 2 2 2 2 3 3 3 4 4 4 5 5
3
Output
3
Approach 1 for Count Number of Occurrences in a Sorted Array
1. Simply do a modified binary search such that
2. Find the first occurrence of X like this:
- Check if the middle element of the array is equal to X.
- If the equal or greater element is at mid then reduce the partition from start to mid-1. As we will have the first occurrence on the left side of mid of array then.
- If the middle element is smaller then we will check in the right side of the middle element as the array is sorted.
- Return the first occurrence.
3. Now similarly find the last occurrence of X in the array by doing
- Check if the middle element of the array is equal to X
- If the equal or smaller element is at mid then increase the partition from mid+1 to high. As we will have the last occurrence on the right side of mid of array then.
- Else search in the left side of array
- return the last occurrence
4. Now the number of occurrences is simply the last occurrence – first occurrence+1.
Implementation
C++ Program
#include <bits/stdc++.h> using namespace std; int first_occurence(int arr[],int N,int X) { int low = 0 , high = N-1; int first = INT_MAX; while(low <= high) { int mid = low + ((high-low)>>1); if(arr[mid] == X) //if found then check the left part for further occurence { if(mid < first) first = mid; high = mid-1; } else if(arr[mid] < X) //if the middle element is smaller than X check in right subpart low = mid + 1; else if (arr[mid] > X)//if middle element is larger than X check in left subpart high = mid - 1; } return first; } int last_occurence(int arr[],int N,int X) { int low = 0 , high = N-1; int last = INT_MIN; while(low <= high) { int mid = low + ((high-low)>>1); if(arr[mid] == X) //if found check in right subpart for last occurence { if(mid > last) last = mid; low = mid+1; } else if(arr[mid] < X) //if the middle element is smaller than X check in right subpart low = mid + 1; else if (arr[mid] > X)//if middle element is larger than X check in left subpart high = mid - 1; } return last; } int main() { int n; cin>>n; int a[n]; for(int i=0;i<n;i++) { cin>>a[i]; } int X; // number whose count is to be found out cin >> X; int count = 0; //initially its count is zero int last = last_occurence(a,n,X); if(last != INT_MIN) count += last; int first = first_occurence(a,n,X); if(first != INT_MAX) count -= first; cout<<last-first+1<<endl; return 0; }
Java Program
import static java.lang.Math.min; import java.util.Scanner; class sum { public static int first_occurence(int arr[],int N,int X) { int low = 0 , high = N-1; int first = 10000000; while(low <= high) { int mid = low + ((high-low)>>1); if(arr[mid] == X) //if found then check the left part for further occurence { if(mid < first) first = mid; high = mid-1; } else if(arr[mid] < X) //if the middle element is smaller than X check in right subpart low = mid + 1; else if (arr[mid] > X)//if middle element is larger than X check in left subpart high = mid - 1; } return first; } public static int last_occurence(int arr[],int N,int X) { int low = 0 , high = N-1; int last = -1; while(low <= high) { int mid = low + ((high-low)>>1); if(arr[mid] == X) //if found check in right subpart for last occurence { if(mid > last) last = mid; low = mid+1; } else if(arr[mid] < X) //if the middle element is smaller than X check in right subpart low = mid + 1; else if (arr[mid] > X)//if middle element is larger than X check in left subpart high = mid - 1; } return last; } public static int abs(int x) { if(x<0) x=x*-1; return x; } public static void main(String[] args) { Scanner sr = new Scanner(System.in); int n = sr.nextInt(); int arr[] = new int[n]; for(int i=0;i<n;i++) { arr[i] = sr.nextInt(); } int X = sr.nextInt(); // number whose count is to be found out int count = 0; //initially its count is zero int last = last_occurence(arr,n,X); if(last != -1) count += last; int first = first_occurence(arr,n,X); if(first != 10000000) count -= first; System.out.println(last-first+1); } }
8 1 1 2 2 2 3 4 5 2
3
Complexity Analysis for Count Number of Occurrences in a Sorted Array
Time Complexity – O(logN) where N is the size of the array. Here we use a binary search which leads us to logN time complexity.
Space Complexity – O(1) because we don’t use any auxiliary space here.
Approach 2 for Count Number of Occurrences in a Sorted Array
- Simply do the same approach as algorithm 1 but using upper_bound() and lower_bound functions.
- Calculate the last occurrence using upper_bound() and first occurrence via lower_bound() functions.
- Number of occurrences is simply the index obtained by upper_bound() –
- lower_bound().
Low_bound(), Upper_bound are Standard Template Library(STL) functions.
Implementation
C++ Program
#include <bits/stdc++.h> using namespace std; int main() { int n; cin>>n; int a[n]; for(int i=0;i<n;i++) { cin>>a[i]; } int X; // number whose count is to be found out cin >> X; int count = 0; //initially its count is zero count = upper_bound(a,a+n,X) - lower_bound(a,a+n,X); cout<<count; return 0; }
8 1 1 2 2 2 3 4 5 4
1
Complexity Analysis for Count Number of Occurrences in a Sorted Array
Time Complexity – O(logN) where N is the size of the array. Here we use inbuild STL function which has logN time complexity.
Space Complexity – O(1) because we don’t use any auxiliary space here.
Approach 3 for Count Number of Occurrences in a Sorted Array
- Simply run a loop.
- If we get an element equal to X start increasing the count
- Till we see X increase the count and as soon as we get a number different from X then we display the obtained count as it is a sorted array.
Explanation
Run one loop from beginning to the end of the array and check for if x==a[i] then increase the counts. Here let’s take an example. a[]={1, 2, 2, 2, 3, 4} and x=2 then the count of x is 3. So, our final answer is 3.
Implementation
C++ Program
#include <bits/stdc++.h> using namespace std; int main() { int n; cin>>n; int a[n]; for(int i=0;i<n;i++) { cin>>a[i]; } int X; // number whose count is to be found out cin >> X; int count = 0; //initially its count is zero for(int i=0;i<n;i++) if(a[i]==X) count++; cout<<count; return 0; }
Java Program
import static java.lang.Math.min; import java.util.Scanner; class sum { public static void main(String[] args) { Scanner sr = new Scanner(System.in); int n = sr.nextInt(); int arr[] = new int[n]; for(int i=0;i<n;i++) { arr[i] = sr.nextInt(); } int X = sr.nextInt(); // number whose count is to be found out int count = 0; //initially its count is zero for(int i=0;i<n;i++) if(arr[i]==X) count++; System.out.println(count); } }
8 1 1 2 2 2 3 4 5 1
2
Complexity Analysis for Count Number of Occurrences in a Sorted Array
Time Complexity – O(N) because we traverse the whole array and count the frequency of x.
Space Complexity – O(1) because we don’t use any auxiliary space here.