Convert an Array to reduced form using Vector of pairs (original) (raw)

Last Updated : 23 Jul, 2025

Given an array with n distinct elements, convert the given array to a form where all elements are in range from 0 to n-1. The order of elements is same, i.e., 0 is placed in place of smallest element, 1 is placed for second smallest element, ... n-1 is placed for largest element.

**Input: arr[] = {10, 40, 20}
**Output: arr[] = {0, 2, 1}
**Input: arr[] = {5, 10, 40, 30, 20}
**Output: arr[] = {0, 1, 4, 3, 2}

We have discussed simple and hashing based solutions. In this post, a new solution is discussed. The idea is to create a vector of pairs. Every element of pair contains element and index. We sort vector by array values. After sorting, we copy indexes to original array.

C++ `

#include <bits/stdc++.h> using namespace std;

// Converts arr[0..n-1] to reduced form. void convert(int arr[], int n) { // A vector of pairs. Every element of // pair contains array element and its // index vector<pair<int, int> > v;

// Put all elements and their index in
// the vector
for (int i = 0; i < n; i++)
    v.push_back(make_pair(arr[i], i));

// Sort the vector by array values
sort(v.begin(), v.end());

// Put indexes of modified vector in arr[]
for (int i = 0; i < n; i++)
    arr[v[i].second] = i;

}

// Utility function to print an array. void printArr(int arr[], int n) { for (int i = 0; i < n; i++) cout << arr[i] << " "; }

// Driver program to test above method 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

// Java equivalent of the code import java.util.*;

public class Main {

// Converts arr[0..n-1] to reduced form.
static void convert(int arr[], int n)
{
    // A vector of pairs. Every element of
    // pair contains array element and its
    // index
    List<Pair> v = new ArrayList<>();

    // Put all elements and their index in
    // the vector
    for (int i = 0; i < n; i++)
        v.add(new Pair(arr[i], i));

    // Sort the vector by array values
    Collections.sort(v, new SortByVal());

    // Put indexes of modified vector in arr[]
    for (int i = 0; i < n; i++)
        arr[v.get(i).getIndex()] = i;
}

// Utility function to print an array.
static void printArr(int arr[], int n)
{
    for (int i = 0; i < n; i++)
        System.out.print(arr[i] + " ");
}

// Driver program to test above method
public static void main (String[] args)
{
    int arr[] = { 10, 20, 15, 12, 11, 50 };
    int n = arr.length;

    System.out.println("Given Array is \n");
    printArr(arr, n);

    convert(arr, n);

    System.out.println("\n\nConverted Array is \n");
    printArr(arr, n);
}

// class to store array elements and its 
// index. 
static class Pair { 

    int val; 
    int index; 

    public Pair(int val, int index) 
    { 
        this.val = val; 
        this.index = index; 
    } 

    public int getVal() 
    { 
        return val; 
    } 

    public int getIndex() 
    { 
        return index; 
    } 
} 

// Comparator to sort the vector elements 
// according to their values 
static class SortByVal implements Comparator<Pair> { 

    public int compare(Pair a, Pair b) 
    { 
        return a.getVal() - b.getVal(); 
    } 
} 

}

Python3

Converts arr[0..n-1] to reduced form.

def convert(arr, n):

# A list of tuples. Every element of
# tuple contains array element and its
# index
v = []

# Put all elements and their index in
# the list
for i in range(n):
    v.append((arr[i], i))

# Sort the list by array values
v.sort()

# Put indexes of modified list in arr[]
for i in range(n):
    arr[v[i][1]] = i

Utility function to print an array.

def printArr(arr, n): for i in range(n): print(arr[i], end=" ")

Driver program to test above method

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)

This code is contributed by Prasad Kandekar(prasad264)

C#

using System; using System.Collections.Generic;

public class Program { // Converts arr[0..n-1] to reduced form. static void Convert(int[] arr, int n) { // A list of pairs. Every element of pair contains // array element and its index List v = new List();

    // Put all elements and their index in the list
    for (int i = 0; i < n; i++)
        v.Add(new Pair(arr[i], i));

    // Sort the list by array values
    v.Sort(new SortByVal());

    // Put indexes of modified list in arr[]
    for (int i = 0; i < n; i++)
        arr[v[i].GetIndex()] = i;
}

// Utility function to print an array.
static void PrintArr(int[] arr, int n)
{
    for (int i = 0; i < n; i++)
        Console.Write(arr[i] + " ");
}

// Driver program to test above method
public static void Main()
{
    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);
}

// class to store array elements and its index.
class Pair {
    int val;
    int index;

    public Pair(int val, int index)
    {
        this.val = val;
        this.index = index;
    }

    public int GetVal() { return val; }

    public int GetIndex() { return index; }
}

// Comparator to sort the list elements
// according to their values
class SortByVal : IComparer<Pair> {
    public int Compare(Pair a, Pair b)
    {
        return a.GetVal() - b.GetVal();
    }
}

}

JavaScript

// Converts arr[0..n-1] to reduced form. function convert(arr, n) {

// An array of pairs. Every element of
// pair contains array element and its
// index
let v = [];

// Put all elements and their index in
// the array
for (let i = 0; i < n; i++)
    v.push([arr[i], i]);

// Sort the array by array values
v.sort((a, b) => a[0] - b[0]);

// Put indexes of modified array in arr[]
for (let i = 0; i < n; i++)
    arr[v[i][1]] = i;

}

// Utility function to print an array. function printArr(arr, n) { for (let i = 0; i < n; i++) console.log(arr[i] + " "); }

// Driver program to test above method let arr = [10, 20, 15, 12, 11, 50]; let n = arr.length;

console.log("Given Array is "); printArr(arr, n);

convert(arr, n);

console.log("\n\nConverted Array is "); printArr(arr, n);

// This code is contributed by prasad264

`

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)

**Another Approach:

  1. Create a copy of the input array and sort it in non-decreasing order.
  2. Create a map where each element of the sorted array is mapped to its corresponding index in the range 0 to n-1.
  3. Traverse the input array and for each element, replace it with the value obtained from the map.

C++ `

#include <bits/stdc++.h> using namespace std;

// Converts arr[0..n-1] to reduced form. void convert(int arr[], int n) { // Make a copy of the input array int sorted_arr[n]; copy(arr, arr+n, sorted_arr);

// Sort the copy in non-decreasing order
sort(sorted_arr, sorted_arr+n);

// Map each element of the sorted array to its index in the range 0 to n-1
unordered_map<int, int> mp;
for (int i = 0; i < n; i++) {
    mp[sorted_arr[i]] = i;
}

// Replace each element of the input array with its corresponding index
for (int i = 0; i < n; i++) {
    arr[i] = mp[arr[i]];
}

}

// Utility function to print an array. void printArr(int arr[], int n) { for (int i = 0; i < n; i++) cout << arr[i] << " "; }

// Driver program to test above method 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.*;

public class Main { // Converts arr[0..n-1] to reduced form. public static void convert(int arr[], int n) { // Make a copy of the input array int[] sorted_arr = Arrays.copyOf(arr, n);

    // Sort the copy in non-decreasing order
    Arrays.sort(sorted_arr);

    // Map each element of the sorted array to its index
    // in the range 0 to n-1
    HashMap<Integer, Integer> mp
        = new HashMap<Integer, Integer>();
    for (int i = 0; i < n; i++) {
        mp.put(sorted_arr[i], i);
    }

    // Replace each element of the input array with its
    // corresponding index
    for (int i = 0; i < n; i++) {
        arr[i] = mp.get(arr[i]);
    }
}

// Utility function to print an array.
public static void printArr(int arr[], int n)
{
    for (int i = 0; i < n; i++) {
        System.out.print(arr[i] + " ");
    }
}

// Driver program to test above method
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);
}

} // This code is contributed by Prajwal Kandekar

Python3

def convert(arr, n): # Make a copy of the input array sorted_arr = arr.copy()

# Sort the copy in non-decreasing order
sorted_arr.sort()

# Map each element of the sorted array to its index in the range 0 to n-1
mp = {}
for i in range(n):
    mp[sorted_arr[i]] = i

# Replace each element of the input array with its corresponding index
for i in range(n):
    arr[i] = mp[arr[i]]

def print_arr(arr, n): for i in range(n): print(arr[i], end=' ') print()

Driver program to test above method

if name == 'main': arr = [10, 20, 15, 12, 11, 50] n = len(arr)

print("Given Array is ")
print_arr(arr, n)

convert(arr, n)

print("\nConverted Array is ")
print_arr(arr, n)

This code is contributed by Prajwal Kandekar

C#

using System; using System.Collections.Generic;

public class GFG { // Converts arr[0..n-1] to reduced form. static void Convert(int[] arr, int n) { // Make a copy of the input array int[] sortedArr = new int[n]; Array.Copy(arr, sortedArr, n);

    // Sort the copy in ascending order
    Array.Sort(sortedArr);

    // Map each element of the sorted array to its index
    // in the range 0 to n-1
    Dictionary<int, int> mp
        = new Dictionary<int, int>();
    for (int i = 0; i < n; i++) {
        mp.Add(sortedArr[i], i);
    }

    // Replace each element of the input array with its
    // corresponding index
    for (int i = 0; i < n; i++) {
        arr[i] = mp[arr[i]];
    }
}

// Utility function to print an array.
static void PrintArr(int[] arr, int n)
{
    for (int i = 0; i < n; i++) {
        Console.Write(arr[i] + " ");
    }
}

// Driver program to test above method
static public void Main()
{
    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);
}

} //This code is contributed by Rohit Singh

` JavaScript ``

function convert(arr, n) { // Make a copy of the input array let sorted_arr = [...arr];

// Sort the copy in non-decreasing order sorted_arr.sort((a, b) => a - b);

// Map each element of the sorted array to its index in the range 0 to n-1 let mp = {}; for (let i = 0; i < n; i++) { mp[sorted_arr[i]] = i; }

// Replace each element of the input array with its corresponding index for (let i = 0; i < n; i++) { arr[i] = mp[arr[i]]; } }

function print_arr(arr, n) { for (let i = 0; i < n; i++) { process.stdout.write(${arr[i]} ); } console.log(); }

// Driver program to test above method let arr = [10, 20, 15, 12, 11, 50]; let n = arr.length;

process.stdout.write("Given Array is \n"); print_arr(arr, n);

convert(arr, n);

process.stdout.write("\nConverted Array is \n"); print_arr(arr, n);

``

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) where n is the size of the input array. This is because the function creates a copy of the input array using the "copy" function, which takes O(n) time, sorts the copy using the "sort" function, which has a time complexity of O(n log n)

**Space Complexity: O(n) we are using extra space as a map.