📜  将数组转换为简化形式|集合2(使用向量对)

📅  最后修改于: 2021-05-04 14:59:14             🧑  作者: Mango

给定具有n个不同元素的数组,请将给定数组转换为所有元素都在0到n-1范围内的形式。元素的顺序相同,即0代替最小的元素,1代表第二个最小的元素,…n-1代表最大的元素。

Input:  arr[] = {10, 40, 20}
Output: arr[] = {0, 2, 1}

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

我们讨论了基于哈希的简单解决方案。

在这篇文章中,讨论了一个新的解决方案。这个想法是创建一个成对的向量。对中的每个元素都包含元素和索引。我们通过数组值对向量进行排序。排序后,我们将索引复制到原始数组。

// C++ program to convert an array in reduced
// form
#include 
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  > 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

输出 :

Given Array is 
10 20 15 12 11 50 

Converted Array is 
0 4 3 2 1 5 

时间复杂度:O(n Log n)
辅助空间:O(n)