Count subarrays with equal number of occurrences of two given elements
Given an array and two integers say, x and y, find the number of subarrays in which the number of occurrences of x is equal to the number of occurrences of y.
Examples:
Input : arr[] = {1, 2, 1},
x = 1, y = 2
Output : 2
The possible sub-arrays have same equal number
of occurrences of x and y are:
1) {1, 2}, x and y have same occurrence(1).
2) {2, 1}, x and y have same occurrence(1).
Input : arr[] = {1, 2, 1},
x = 4, y = 6
Output : 6
The possible sub-arrays have same equal number of
occurrences of x and y are:
1) {1}, x and y have same occurrence(0).
2) {2}, x and y have same occurrence(0).
3) {1}, x and y have same occurrence(0).
1) {1, 2}, x and y have same occurrence(0).
2) {2, 1}, x and y have same occurrence(0).
3) {1, 2, 1}, x and y have same occurrence(0).
Input : arr[] = {1, 2, 1},
x = 1, y = 1
Output : 6
The possible sub-arrays have same equal number
of occurrences of x and y are:
1) {1}, x and y have same occurrence(1).
2) {2}, x and y have same occurrence(0).
3) {1}, x and y have same occurrence(1).
1) {1, 2}, x and y have same occurrence(1).
2) {2, 1}, x and y have same occurrence(1).
3) {1, 2, 1}, x and y have same occurrences (2).
We can simply generate all the possible sub-arrays and check for each subarray whether the number of occurrences of x is equal to that of y in that particular subarray.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int sameOccurrence( int arr[], int n, int x, int y)
{
int result = 0;
for ( int i = 0; i <= n - 1; i++) {
int ctX = 0, ctY = 0;
for ( int j = i; j <= n - 1; j++) {
if (arr[j] == x)
ctX += 1;
else if (arr[j] == y)
ctY += 1;
if (ctX == ctY)
result += 1;
}
}
return (result);
}
int main()
{
int arr[] = { 1, 2, 2, 3, 4, 1 };
int n = sizeof (arr) / sizeof (arr[0]);
int x = 2, y = 3;
cout << sameOccurrence(arr, n, x, y);
return (0);
}
|
Java
import java.util.*;
class solution
{
static int sameOccurrence( int arr[], int n, int x, int y)
{
int result = 0 ;
for ( int i = 0 ; i <= n - 1 ; i++) {
int ctX = 0 , ctY = 0 ;
for ( int j = i; j <= n - 1 ; j++) {
if (arr[j] == x)
ctX += 1 ;
else if (arr[j] == y)
ctY += 1 ;
if (ctX == ctY)
result += 1 ;
}
}
return (result);
}
public static void main(String args[])
{
int arr[] = { 1 , 2 , 2 , 3 , 4 , 1 };
int n = arr.length;
int x = 2 , y = 3 ;
System.out.println(sameOccurrence(arr, n, x, y));
}
}
|
Python3
def sameOccurrence(arr, n, x, y):
result = 0
for i in range (n):
ctX = 0
ctY = 0
for j in range (i, n, 1 ):
if (arr[j] = = x):
ctX + = 1 ;
elif (arr[j] = = y):
ctY + = 1
if (ctX = = ctY):
result + = 1
return (result)
if __name__ = = '__main__' :
arr = [ 1 , 2 , 2 , 3 , 4 , 1 ]
n = len (arr)
x = 2
y = 3
print (sameOccurrence(arr, n, x, y))
|
C#
using System;
class GFG
{
static int sameOccurrence( int [] arr, int n,
int x, int y)
{
int result = 0;
for ( int i = 0; i <= n - 1; i++)
{
int ctX = 0, ctY = 0;
for ( int j = i; j <= n - 1; j++)
{
if (arr[j] == x)
ctX += 1;
else if (arr[j] == y)
ctY += 1;
if (ctX == ctY)
result += 1;
}
}
return (result);
}
public static void Main()
{
int [] arr = { 1, 2, 2, 3, 4, 1 };
int n = arr.Length;
int x = 2, y = 3;
Console.Write(sameOccurrence(arr, n, x, y));
}
}
|
PHP
<?php
function sameOccurrence( $arr , $n , $x , $y )
{
$result = 0;
for ( $i = 0; $i <= $n - 1; $i ++)
{
$ctX = 0; $ctY = 0;
for ( $j = $i ; $j <= $n - 1; $j ++)
{
if ( $arr [ $j ] == $x )
$ctX += 1;
else if ( $arr [ $j ] == $y )
$ctY += 1;
if ( $ctX == $ctY )
$result += 1;
}
}
return ( $result );
}
$arr = array ( 1, 2, 2, 3, 4, 1 );
$n = count ( $arr );
$x = 2; $y = 3;
echo sameOccurrence( $arr , $n , $x , $y );
?>
|
Javascript
<script>
function sameOccurrence(arr, n, x, y)
{
let result = 0;
for (let i = 0; i <= n - 1; i++)
{
let ctX = 0, ctY = 0;
for (let j = i; j <= n - 1; j++)
{
if (arr[j] == x)
ctX += 1;
else if (arr[j] == y)
ctY += 1;
if (ctX == ctY)
result += 1;
}
}
return (result);
}
let arr = [ 1, 2, 2, 3, 4, 1 ];
let n = arr.length;
let x = 2, y = 3;
document.write(sameOccurrence(arr, n, x, y));
</script>
|
Time Complexity – O(N^2)
Auxiliary Space – O(1)
Efficient Approach (O(N) Time Complexity) :
In this solution, auxiliary space is O(N) and the time complexity is also O(N). We create two arrays say, countX[] and countY[], which denotes the number of occurrences of x and y, respectively, till that point in the array. Then, we evaluate another array, say diff which stores (countX[i]-countY[i]), i be the index of the array. Now, store the count of each element of array diff in a map, say m. Initialize result as m[0] since the occurrence of 0 in diff array gives us subarray count where the required condition is followed.
Now, iterate through the map and using handshake formula, update the result, since two same values in diff array indicate that the subarray contains the same number of occurrences of x and y.
Explanation:
arr[] = {1, 2, 2, 3, 4, 1};
x = 2, y = 3;
Two arrays countX[] and countY[] are be evaluated as-
countX[] = {0, 1, 2, 2, 2, 2};
countY[] = {0, 0, 0, 1, 1, 1};
Hence, diff[] = {0, 1, 2, 1, 1, 1};
(diff[i] = countX[i]-countY[i], i be the index of array)
Now, create a map and store the count of each element of diff in it,
so, finally, we get-
m[0] = 1, m[1] = 4, m[2] = 1;
Initialize result as m[0]
i.e result = m[0] = 1
Further, using handshake formula, updating the
result as follows-
result = result + (1*(1-1))/2 = 1 + 0 = 1
result = result + (4*(4-1))/2 = 1 + 6 = 7
result = result + (1*(1-1))/2 = 7 + 0 = 7
so, the final result will be 7, required subarrays having
same number of occurrences of x and y.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int sameOccurrence( int arr[], int n, int x, int y)
{
int countX[n], countY[n];
map< int , int > m;
for ( int i = 0; i < n; i++) {
if (arr[i] == x) {
if (i != 0)
countX[i] = countX[i - 1] + 1;
else
countX[i] = 1;
} else {
if (i != 0)
countX[i] = countX[i - 1];
else
countX[i] = 0;
}
if (arr[i] == y) {
if (i != 0)
countY[i] = countY[i - 1] + 1;
else
countY[i] = 1;
} else {
if (i != 0)
countY[i] = countY[i - 1];
else
countY[i] = 0;
}
m[countX[i] - countY[i]]++;
}
int result = m[0];
for ( auto it = m.begin(); it != m.end(); it++)
result = result + ((it->second) * ((it->second) - 1)) / 2;
return (result);
}
int main()
{
int arr[] = { 1, 2, 2, 3, 4, 1 };
int n = sizeof (arr) / sizeof (arr[0]);
int x = 2, y = 3;
cout << sameOccurrence(arr, n, x, y);
return (0);
}
|
Java
import java.util.*;
class GFG
{
static int sameOccurrence( int arr[], int n, int x, int y)
{
int []countX = new int [n];
int []countY = new int [n];
Map<Integer,Integer> m = new HashMap<>();
for ( int i = 0 ; i < n; i++)
{
if (arr[i] == x)
{
if (i != 0 )
countX[i] = countX[i - 1 ] + 1 ;
else
countX[i] = 1 ;
}
else
{
if (i != 0 )
countX[i] = countX[i - 1 ];
else
countX[i] = 0 ;
}
if (arr[i] == y)
{
if (i != 0 )
countY[i] = countY[i - 1 ] + 1 ;
else
countY[i] = 1 ;
}
else
{
if (i != 0 )
countY[i] = countY[i - 1 ];
else
countY[i] = 0 ;
}
if (m.containsKey(countX[i] - countY[i]))
{
m.put(countX[i] - countY[i], m.get(countX[i] - countY[i])+ 1 );
}
else
{
m.put(countX[i] - countY[i], 1 );
}
}
int result = m.get( 0 );
for (Map.Entry<Integer,Integer> it : m.entrySet())
result = result + ((it.getValue()) * ((it.getValue()) - 1 )) / 2 ;
return (result);
}
public static void main(String[] args)
{
int arr[] = { 1 , 2 , 2 , 3 , 4 , 1 };
int n = arr.length;
int x = 2 , y = 3 ;
System.out.println(sameOccurrence(arr, n, x, y));
}
}
|
Python3
def sameOccurrence( arr, n, x, y):
countX = [ 0 for i in range (n)]
countY = [ 0 for i in range (n)]
m = dict ()
for i in range (n):
if (arr[i] = = x):
if (i ! = 0 ):
countX[i] = countX[i - 1 ] + 1
else :
countX[i] = 1
else :
if (i ! = 0 ):
countX[i] = countX[i - 1 ]
else :
countX[i] = 0
if (arr[i] = = y):
if (i ! = 0 ):
countY[i] = countY[i - 1 ] + 1
else :
countY[i] = 1
else :
if (i ! = 0 ):
countY[i] = countY[i - 1 ]
else :
countY[i] = 0
m[countX[i] - countY[i]] = m.get(countX[i] -
countY[i], 0 ) + 1
result = m[ 0 ]
for j in m:
result + = (m[j] * (m[j] - 1 )) / / 2
return result
arr = [ 1 , 2 , 2 , 3 , 4 , 1 ]
n = len (arr)
x, y = 2 , 3
print (sameOccurrence(arr, n, x, y))
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static int sameOccurrence( int []arr, int n, int x, int y)
{
int []countX = new int [n];
int []countY = new int [n];
Dictionary< int , int > m = new Dictionary< int , int >();
for ( int i = 0; i < n; i++)
{
if (arr[i] == x)
{
if (i != 0)
countX[i] = countX[i - 1] + 1;
else
countX[i] = 1;
}
else
{
if (i != 0)
countX[i] = countX[i - 1];
else
countX[i] = 0;
}
if (arr[i] == y)
{
if (i != 0)
countY[i] = countY[i - 1] + 1;
else
countY[i] = 1;
}
else
{
if (i != 0)
countY[i] = countY[i - 1];
else
countY[i] = 0;
}
if (m.ContainsKey(countX[i] - countY[i]))
{
var v = m[countX[i] - countY[i]]+1;
m.Remove(countX[i] - countY[i]);
m.Add(countX[i] - countY[i], v);
}
else
{
m.Add(countX[i] - countY[i], 1);
}
}
int result = m[0];
foreach (KeyValuePair< int , int > it in m)
result = result + ((it.Value) * ((it.Value) - 1)) / 2;
return (result);
}
public static void Main(String[] args)
{
int []arr = { 1, 2, 2, 3, 4, 1 };
int n = arr.Length;
int x = 2, y = 3;
Console.WriteLine(sameOccurrence(arr, n, x, y));
}
}
|
Javascript
<script>
function sameOccurrence(arr,n,x,y)
{
let countX = new Array(n);
let countY = new Array(n);
let m = new Map();
for (let i = 0; i < n; i++)
{
if (arr[i] == x)
{
if (i != 0)
countX[i] = countX[i - 1] + 1;
else
countX[i] = 1;
}
else
{
if (i != 0)
countX[i] = countX[i - 1];
else
countX[i] = 0;
}
if (arr[i] == y)
{
if (i != 0)
countY[i] = countY[i - 1] + 1;
else
countY[i] = 1;
}
else
{
if (i != 0)
countY[i] = countY[i - 1];
else
countY[i] = 0;
}
if (m.has(countX[i] - countY[i]))
{
m.set(countX[i] - countY[i], m.get(countX[i] - countY[i])+1);
}
else
{
m.set(countX[i] - countY[i], 1);
}
}
let result = m.get(0);
for (let [key, value] of m.entries())
result = result + (value) * ((value) - 1) / 2;
return (result);
}
let arr=[1, 2, 2, 3, 4, 1];
let n = arr.length;
let x = 2, y = 3;
document.write(sameOccurrence(arr, n, x, y));
</script>
|
Time Complexity – O(N)
Auxiliary Space – O(N)
Last Updated :
05 Jan, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...