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.
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
09 Nov, 2022
Like Article
Save Article