Given an array with N distinct elements, convert the given array to a form where all elements are in the range from 0 to N-1. The order of elements is the same, i.e., 0 is placed in the place of the smallest element, 1 is placed for the second smallest element, … N-1 is placed for the largest element.
Examples:
Input: arr[] = {10, 40, 20}
Output: arr[] = {0, 2, 1}
Input: arr[] = {5, 10, 40, 30, 20}
Output: arr[] = {0, 1, 4, 3, 2}
Naive Approach:
A simple solution is to first find the minimum element, replace it with 0, consider the remaining array and find the minimum in the remaining array and replace it with 1, and so on.
- Iterate over the array
- Find the minimum element and keep its position of occurrence.
- Update the result at the minimum index element with the new Position
- Increment the new position by 1.
- Update the original element at the current minimum element with the maximum value possible, so that it won’t be minimum in a further iteration
- Return the result
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
vector< int > convert(vector< int >& arr)
{
int n = arr.size();
vector< int > result(n);
int currPos = 0;
for ( int i = 0; i < n; i++) {
int minn = INT_MAX;
int idx = -1;
for ( int j = 0; j < n; j++) {
if (minn > arr[j]) {
minn = arr[j];
idx = j;
}
}
result[idx] = currPos;
currPos++;
arr[idx] = INT_MAX;
}
return result;
}
void printArr(vector< int >& arr)
{
for ( auto i : arr) {
cout << i << " " ;
}
}
int main()
{
vector< int > arr = { 10, 20, 15, 12, 11, 50 };
int n = arr.size();
cout << "Given Array is \n" ;
printArr(arr);
vector< int > result = convert(arr);
cout << "\n\nConverted Array is \n" ;
printArr(result);
return 0;
}
|
Java
import java.util.*;
import java.io.*;
public class Gfg {
static int [] convert( int [] arr)
{
int n = arr.length;
int [] result = new int [n];
int currPos = 0 ;
for ( int i = 0 ; i < n; i++) {
int minn = Integer.MAX_VALUE;
int idx = - 1 ;
for ( int j = 0 ; j < n; j++) {
if (minn > arr[j]) {
minn = arr[j];
idx = j;
}
}
result[idx] = currPos;
currPos++;
arr[idx] = Integer.MAX_VALUE;
}
return result;
}
static void printArr( int [] arr)
{
for ( int i : arr) {
System.out.print(i + " " );
}
}
public static void main(String[] args)
{
int [] arr = { 10 , 20 , 15 , 12 , 11 , 50 };
int n = arr.length;
System.out.println( "Given Array is" );
printArr(arr);
int [] result = convert(arr);
System.out.println( "\n\nConverted Array is" );
printArr(result);
}
}
|
Python3
from typing import List
import sys
def convert(arr: List [ int ]) - > List [ int ]:
n = len (arr)
result = [ 0 ] * n
curr_pos = 0
for i in range (n):
minn = sys.maxsize
idx = - 1
for j in range (n):
if (minn > arr[j]):
minn = arr[j]
idx = j
result[idx] = curr_pos
curr_pos + = 1
arr[idx] = sys.maxsize
return result
def printArr(arr: List [ int ]):
for i in arr:
print (i, end = " " )
if __name__ = = '__main__' :
arr = [ 10 , 20 , 15 , 12 , 11 , 50 ]
n = len (arr)
print ( "Given Array is " )
printArr(arr)
result = convert(arr)
print ( "\n\nConverted Array is " )
printArr(result)
|
C#
using System;
class Gfg
{
static int [] Convert( int [] arr)
{
int n = arr.Length;
int [] result = new int [n];
int currPos = 0;
for ( int i = 0; i < n; i++)
{
int minn = int .MaxValue;
int idx = -1;
for ( int j = 0; j < n; j++)
{
if (minn > arr[j])
{
minn = arr[j];
idx = j;
}
}
result[idx] = currPos;
currPos++;
arr[idx] = int .MaxValue;
}
return result;
}
static void PrintArr( int [] arr)
{
for ( int i = 0; i < arr.Length; i++)
{
Console.Write(arr[i] + " " );
}
}
public static void Main( string [] args)
{
int [] arr = { 10, 20, 15, 12, 11, 50 };
int n = arr.Length;
Console.WriteLine( "Given Array is" );
PrintArr(arr);
int [] result = Convert(arr);
Console.WriteLine( "\n\nConverted Array is" );
PrintArr(result);
}
}
|
Javascript
function convert(arr)
{
let n = arr.length;
let result= new Array(n);
let currPos = 0;
for (let i = 0; i < n; i++) {
let minn = Number.MAX_SAFE_INTEGER;
let idx = -1;
for (let j = 0; j < n; j++) {
if (minn > arr[j]) {
minn = arr[j];
idx = j;
}
}
result[idx] = currPos;
currPos++;
arr[idx] = Number.MAX_SAFE_INTEGER;
}
return result;
}
function printArr(arr)
{
for (let i=0; i<arr.length; i++) {
document.write(arr[i] + " " );
}
}
let arr = [ 10, 20, 15, 12, 11, 50 ];
let n = arr.length;
document.write( "Given Array is" );
printArr(arr);
let result = convert(arr);
document.write( "Converted Array is " );
printArr(result);
|
Output
Given Array is
10 20 15 12 11 50
Converted Array is
0 4 3 2 1 5
Time complexity: O(N2)
Auxiliary space: O(N)
Efficient Approach:
The idea is to sort the given array and use an unordered map to store the reduced form of each value of array then update the whole array to its reduced form using values from unordered map.
Follow the below steps to implement the idea:
- Create a temp array and copy the contents of the given array to temp[].
- Sort temp[] in ascending order.
- Create an empty hash table.
- Traverse temp[] from left to right and store mapping of numbers and their values (in converted array) in the hash table.
- Traverse given array and change elements to their positions using a hash table.
Below are implementations of the above idea.
C++
#include <bits/stdc++.h>
using namespace std;
void convert( int arr[], int n)
{
int temp[n];
memcpy (temp, arr, n* sizeof ( int ));
sort(temp, temp + n);
unordered_map< int , int > umap;
int val = 0;
for ( int i = 0; i < n; i++)
umap[temp[i]] = val++;
for ( int i = 0; i < n; i++)
arr[i] = umap[arr[i]];
}
void printArr( int arr[], int n)
{
for ( int i=0; i<n; i++)
cout << arr[i] << " " ;
}
int main()
{
int arr[] = {10, 20, 15, 12, 11, 50};
int n = sizeof (arr)/ sizeof (arr[0]);
cout << "Given Array is \n" ;
printArr(arr, n);
convert(arr , n);
cout << "\n\nConverted Array is \n" ;
printArr(arr, n);
return 0;
}
|
Java
import java.util.*;
class GFG
{
public static void convert( int arr[], int n)
{
int temp[] = arr.clone();
Arrays.sort(temp);
HashMap<Integer, Integer> umap = new HashMap<>();
int val = 0 ;
for ( int i = 0 ; i < n; i++)
umap.put(temp[i], val++);
for ( int i = 0 ; i < n; i++)
arr[i] = umap.get(arr[i]);
}
public static void printArr( int arr[], int n)
{
for ( int i = 0 ; i < n; i++)
System.out.print(arr[i] + " " );
}
public static void main(String[] args)
{
int arr[] = { 10 , 20 , 15 , 12 , 11 , 50 };
int n = arr.length;
System.out.println( "Given Array is " );
printArr(arr, n);
convert(arr , n);
System.out.println( "\n\nConverted Array is " );
printArr(arr, n);
}
}
|
Python3
def convert(arr, n):
temp = [arr[i] for i in range (n) ]
temp.sort()
umap = {}
val = 0
for i in range (n):
umap[temp[i]] = val
val + = 1
for i in range (n):
arr[i] = umap[arr[i]]
def printArr(arr, n):
for i in range (n):
print (arr[i], end = " " )
if __name__ = = "__main__" :
arr = [ 10 , 20 , 15 , 12 , 11 , 50 ]
n = len (arr)
print ( "Given Array is " )
printArr(arr, n)
convert(arr , n)
print ( "\n\nConverted Array is " )
printArr(arr, n)
|
C#
using System;
using System.Collections.Generic;
using System.Linq;
class GFG
{
public static void convert( int []arr, int n)
{
int []temp = new int [arr.Length];
Array.Copy(arr, 0, temp, 0, arr.Length);
Array.Sort(temp);
Dictionary< int , int > umap =
new Dictionary< int , int >();
int val = 0;
for ( int i = 0; i < n; i++)
if (umap.ContainsKey(temp[i]))
umap[temp[i]] = val++;
else
umap.Add(temp[i], val++);
for ( int i = 0; i < n; i++)
arr[i] = umap[arr[i]];
}
public static void printArr( int []arr, int n)
{
for ( int i = 0; i < n; i++)
Console.Write(arr[i] + " " );
}
public static void Main(String[] args)
{
int []arr = {10, 20, 15, 12, 11, 50};
int n = arr.Length;
Console.WriteLine( "Given Array is " );
printArr(arr, n);
convert(arr , n);
Console.WriteLine( "\n\nConverted Array is " );
printArr(arr, n);
}
}
|
Javascript
<script>
function convert(arr, n)
{
let temp = [...arr];
temp.sort((a, b) => a - b);
let umap = new Map();
let val = 0;
for (let i = 0; i < n; i++)
umap.set(temp[i], val++);
for (let i = 0; i < n; i++)
arr[i] = umap.get(arr[i]);
}
function prletArr(arr, n)
{
for (let i = 0; i < n; i++)
document.write(arr[i] + " " );
}
let arr = [10, 20, 15, 12, 11, 50];
let n = arr.length;
document.write( "Given Array is " + "<br/>" );
prletArr(arr, n);
convert(arr , n);
document.write( "<br/>" + "Converted Array is " + "<br/>" );
prletArr(arr, n);
</script>
|
Output
Given Array is
10 20 15 12 11 50
Converted Array is
0 4 3 2 1 5
Time complexity: O(N * log N)
Auxiliary Space: O(N)
Using priority_queue and hashmap:
The idea is to sort the given array using priority_queue instead of calling sort stl and use an unordered map to store the reduced form of each value of array then update the whole array to its reduced form using values from unordered map.
Algorithm:
- Create a priority_queue pq to get the sorted version of arr in increasing order.
- Push the values of arr in the priority queue.
- Create a temp array and copy the contents of the priority_queue to temp[].
- Create an empty hash table.
- Traverse temp[] from left to right and store mapping of numbers and their values (in converted array) in the hash table.
- Traverse given array and change elements to their positions using a hash table.
Below is the implementation of the approach:
C++
#include <bits/stdc++.h>
using namespace std;
void convert( int arr[], int n) {
int temp[n];
memcpy (temp, arr, n* sizeof ( int ));
priority_queue< int , vector< int >, greater< int >> pq;
for ( int i = 0; i < n; i++)
pq.push( arr[i] );
int i = 0;
while (!pq.empty()) {
temp[i++] = pq.top();
pq.pop();
}
unordered_map< int , int > umap;
int val = 0;
for ( int i = 0; i < n; i++)
umap[temp[i]] = val++;
for ( int i = 0; i < n; i++)
arr[i] = umap[arr[i]];
}
void printArr( int arr[], int n)
{
for ( int i=0; i<n; i++)
cout << arr[i] << " " ;
}
int main()
{
int arr[] = {10, 20, 15, 12, 11, 50};
int n = sizeof (arr)/ sizeof (arr[0]);
cout << "Given Array is \n" ;
printArr(arr, n);
convert(arr , n);
cout << "\n\nConverted Array is \n" ;
printArr(arr, n);
return 0;
}
|
Java
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;
class Gfg {
public static void convert( int [] arr, int n) {
int [] temp = Arrays.copyOf(arr, n);
PriorityQueue<Integer> pq = new PriorityQueue<>();
for ( int i = 0 ; i < n; i++) {
pq.offer(arr[i]);
}
int i = 0 ;
while (!pq.isEmpty()) {
temp[i++] = pq.poll();
}
Map<Integer, Integer> umap = new HashMap<>();
int val = 0 ;
for (i = 0 ; i < n; i++) {
umap.put(temp[i], val++);
}
for (i = 0 ; i < n; i++) {
arr[i] = umap.get(arr[i]);
}
}
public static void printArr( int [] arr, int n) {
for ( int i = 0 ; i < n; i++) {
System.out.print(arr[i] + " " );
}
}
public static void main(String[] args) {
int [] arr = { 10 , 20 , 15 , 12 , 11 , 50 };
int n = arr.length;
System.out.println( "Given Array is " );
printArr(arr, n);
convert(arr, n);
System.out.println( "\n\nConverted Array is " );
printArr(arr, n);
}
}
|
Python3
import heapq
def convert(arr):
n = len (arr)
temp = list (arr)
pq = []
for i in range (n):
heapq.heappush(pq, arr[i])
i = 0
while len (pq) ! = 0 :
temp[i] = heapq.heappop(pq)
i + = 1
umap = {}
val = 0
for i in range (n):
umap[temp[i]] = val
val + = 1
for i in range (n):
arr[i] = umap[arr[i]]
if __name__ = = "__main__" :
arr = [ 10 , 20 , 15 , 12 , 11 , 50 ]
print ( "Given array is" )
print (arr)
convert(arr)
print ( "\nConverted array is" )
print (arr)
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static void Convert( int [] arr, int n)
{
int [] temp = new int [n];
Array.Copy(arr, temp, n);
var pq = new SortedSet< int >(temp);
int i = 0;
foreach ( var num in pq)
{
temp[i++] = num;
}
var dict = new Dictionary< int , int >();
int val = 0;
foreach ( var num in temp)
{
if (!dict.ContainsKey(num))
{
dict[num] = val++;
}
}
for ( int j = 0; j < n; j++)
{
arr[j] = dict[arr[j]];
}
}
static void PrintArr( int [] arr)
{
foreach ( int num in arr)
{
Console.Write(num + " " );
}
}
static void Main()
{
int [] arr = { 10, 20, 15, 12, 11, 50 };
int n = arr.Length;
Console.WriteLine( "Given Array is:" );
PrintArr(arr);
Convert(arr, n);
Console.WriteLine( "\n\nConverted Array is:" );
PrintArr(arr);
}
}
|
Javascript
function convert(arr) {
let temp = arr.slice();
temp.sort((a, b) => a - b);
let umap = new Map();
for (let i = 0; i < arr.length; i++) {
umap.set(temp[i], i);
}
for (let i = 0; i < arr.length; i++) {
arr[i] = umap.get(arr[i]);
}
}
function printArr(arr) {
for (let i = 0; i < arr.length; i++) {
console.log(arr[i] + " " );
}
}
let arr = [10, 20, 15, 12, 11, 50];
console.log( "Given Array is:" );
printArr(arr);
convert(arr);
console.log( "\nConverted Array is:" );
printArr(arr);
|
Output
Given Array is
10 20 15 12 11 50
Converted Array is
0 4 3 2 1 5
Time Complexity: O(N * log N) as insertion of N elements in priority_queue takes N*logN time. Here, N is size of the input array.
Space Complexity: O(N) as priority_queue pq and temp array has been created.
Convert an array to reduced form | Set 2 (Using vector of pairs)
Please write comments if you find anything incorrect, or if you want to share more information about the topic discussed above.
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 :
08 Oct, 2023
Like Article
Save Article