Generate original array from an array that store the counts of greater elements on right
Last Updated :
09 Nov, 2022
Given an array of integers greater[] in which every value of array represents how many elements are greater to its right side in an unknown array arr[]. Our task is to generate original array arr[]. It may be assumed that the original array contains elements in range from 1 to n and all elements are unique
Examples:
Input: greater[] = { 6, 3, 2, 1, 0, 0, 0 }
Output: arr[] = [ 1, 4, 5, 6, 7, 3, 2 ]
Input: greater[] = { 0, 0, 0, 0, 0 }
Output: arr[] = [ 5, 4, 3, 2, 1 ]
We consider an array of elements temp[] = {1, 2, 3, 4, .. n}. We know value of greater[0] indicates count of elements greater than arr[0]. We can observe that (n – greater[0])-th element of temp[] can be put at arr[0]. So we put this at arr[0] and remove this from temp[]. We repeat above process for remaining elements. For every element greater[i], we put (n – greater[i] – i)-th element of temp[] in arr[i] and remove it from temp[].
Below is the implementation of the above idea
C++
#include <bits/stdc++.h>
using namespace std;
void originalArray( int greater[], int n)
{
vector< int > temp;
for ( int i = 0; i <= n; i++)
temp.push_back(i);
int arr[n];
for ( int i = 0; i < n; i++) {
int k = n - greater[i] - i;
arr[i] = temp[k];
temp.erase(temp.begin() + k);
}
for ( int i = 0; i < n; i++)
cout << arr[i] << " " ;
}
int main()
{
int Arr[] = { 6, 3, 2, 1, 0, 1, 0 };
int n = sizeof (Arr) / sizeof (Arr[0]);
originalArray(Arr, n);
return 0;
}
|
Java
import java.util.Vector;
class GFG {
static void originalArray( int greater[], int n)
{
Vector<Integer> temp = new Vector<Integer>();
for ( int i = 0 ; i <= n; i++)
temp.add(i);
int arr[] = new int [n];
for ( int i = 0 ; i < n; i++) {
int k = n - greater[i] - i;
arr[i] = temp.get(k);
temp.remove(k);
}
for ( int i = 0 ; i < n; i++)
System.out.print(arr[i] + " " );
}
public static void main(String[] args)
{
int Arr[] = { 6 , 3 , 2 , 1 , 0 , 1 , 0 };
int n = Arr.length;
originalArray(Arr, n);
}
}
|
Python3
def originalArray(greater, n):
temp = []
for i in range (n + 1 ):
temp.append(i)
arr = [ 0 for i in range (n)]
for i in range (n):
k = n - greater[i] - i
arr[i] = temp[k]
del temp[k]
for i in range (n):
print (arr[i], end = " " )
arr = [ 6 , 3 , 2 , 1 , 0 , 1 , 0 ]
n = len (arr)
originalArray(arr, n)
|
C#
using System;
using System.Collections.Generic;
class GFG {
static void originalArray( int [] greater, int n)
{
List< int > temp = new List< int >();
for ( int i = 0; i <= n; i++)
temp.Add(i);
int [] arr = new int [n];
for ( int i = 0; i < n; i++) {
int k = n - greater[i] - i;
arr[i] = temp[k];
temp.RemoveAt(k);
}
for ( int i = 0; i < n; i++)
Console.Write(arr[i] + " " );
}
public static void Main()
{
int [] Arr = { 6, 3, 2, 1, 0, 1, 0 };
int n = Arr.Length;
originalArray(Arr, n);
}
}
|
Javascript
<script>
function originalArray(greater,n)
{
let temp = [];
for (let i = 0; i <= n; i++)
temp.push(i);
let arr = new Array(n);
for (let i = 0; i < n; i++)
{
let k = n - greater[i] - i;
arr[i] = temp[k];
temp.splice(k,1);
}
for (let i = 0; i < n; i++)
document.write(arr[i] + " " );
}
let Arr=[6, 3, 2, 1, 0, 1, 0 ];
let n = Arr.length;
originalArray(Arr, n);
</script>
|
Time Complexity: (n2) (Erase operation takes O(n) in vector).
Auxiliary Space: O(n), extra space is required for temp and res arrays.
Share your thoughts in the comments
Please Login to comment...