Generate array having differences between count of occurrences of every array element on its left and right
Last Updated :
15 Mar, 2023
Given an array A[] consisting of N integers, the task is to construct an array B[] such that for every ith index, B[i] = X – Y, where X and Y are the count of occurrences of A[i] after and before the ith index.
Examples:
Input: A[] = {3, 2, 1, 2, 3}
Output: 1 1 0 -1 -1
Explanation:
arr[0] = 3, X = 1, Y = 0. Therefore, print 1.
arr[1] = 2, X = 1, Y = 0. Therefore, print 1.
arr[2] = 1, X = 0, Y = 0. Therefore, print 0.
arr[3] = 2, X = 0, Y = 1. Therefore, print -1.
arr[4] = 3, X = 0, Y = 1. Therefore, print -1.
Input: A[] = {1, 2, 3, 4, 5}
Output: 0 0 0 0 0
Naive Approach:
The simplest approach to solve the problem is to traverse the array and consider every array element and compare it with all the elements on its left and right. For every array element, print the difference in its count of occurrences in its left and right.
Time Complexity: O(N2)
Auxiliary Space: O(1)
Efficient Approach: Follow the steps below to optimize the above approach:
- Initialize two arrays left[] and right[] to store frequencies of array elements present on the left and right indices of every array element.
- Compute the left and right cumulative frequency tables.
- Print the difference of same indexed elements from the two frequency arrays.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void constructArray( int A[], int N)
{
int left[N + 1] = { 0 };
int right[N + 1] = { 0 };
int X[N + 1] = { 0 }, Y[N + 1] = { 0 };
for ( int i = 0; i < N; i++) {
X[i] = left[A[i]];
left[A[i]]++;
}
for ( int i = N - 1; i >= 0; i--) {
Y[i] = right[A[i]];
right[A[i]]++;
}
for ( int i = 0; i < N; i++) {
cout << Y[i] - X[i] << " " ;
}
}
int main()
{
int A[] = { 3, 2, 1, 2, 3 };
int N = sizeof (A) / sizeof (A[0]);
constructArray(A, N);
return 0;
}
|
Java
import java.io.*;
class GFG{
static void constructArray( int A[], int N)
{
int [] left = new int [N + 1 ];
int [] right = new int [N + 1 ];
int [] X = new int [N + 1 ];
int [] Y = new int [N + 1 ];
for ( int i = 0 ; i < N; i++)
{
X[i] = left[A[i]];
left[A[i]]++;
}
for ( int i = N - 1 ; i >= 0 ; i--)
{
Y[i] = right[A[i]];
right[A[i]]++;
}
for ( int i = 0 ; i < N; i++)
{
System.out.print(Y[i] - X[i] + " " );
}
}
public static void main(String[] args)
{
int A[] = { 3 , 2 , 1 , 2 , 3 };
int N = A.length;
constructArray(A, N);
}
}
|
Python3
def constructArray(A, N):
left = [ 0 ] * (N + 1 )
right = [ 0 ] * (N + 1 )
X = [ 0 ] * (N + 1 )
Y = [ 0 ] * (N + 1 )
for i in range ( 0 , N):
X[i] = left[A[i]]
left[A[i]] + = 1
for i in range (N - 1 , - 1 , - 1 ):
Y[i] = right[A[i]]
right[A[i]] + = 1
for i in range ( 0 , N):
print (Y[i] - X[i], end = " " )
if __name__ = = '__main__' :
A = [ 3 , 2 , 1 , 2 , 3 ]
N = len (A)
constructArray(A, N)
|
C#
using System;
class GFG{
static void constructArray( int [] A, int N)
{
int [] left = new int [N + 1];
int [] right = new int [N + 1];
int [] X = new int [N + 1];
int [] Y = new int [N + 1];
for ( int i = 0; i < N; i++)
{
X[i] = left[A[i]];
left[A[i]]++;
}
for ( int i = N - 1; i >= 0; i--)
{
Y[i] = right[A[i]];
right[A[i]]++;
}
for ( int i = 0; i < N; i++)
{
Console.Write(Y[i] - X[i] + " " );
}
}
public static void Main()
{
int [] A = { 3, 2, 1, 2, 3 };
int N = A.Length;
constructArray(A, N);
}
}
|
Javascript
<script>
function constructArray(A, N)
{
let left = [];
let right = [];
let X = [];
let Y = [];
for (let i = 0; i < N; i++)
{
X[i] = 0;
left[i] = 0;
right[i] = 0;
Y[i]= 0;
}
for (let i = 0; i < N; i++)
{
X[i] = left[A[i]];
left[A[i]]++;
}
for (let i = N - 1; i >= 0; i--)
{
Y[i] = right[A[i]];
right[A[i]]++;
}
for (let i = 0; i < N; i++)
{
document.write(Y[i] - X[i] + " " );
}
}
let A = [ 3, 2, 1, 2, 3 ];
let N = A.length;
constructArray(A, N);
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(N)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...