给定N个整数的数组arr [] ,任务是将Array中的每个元素替换为它们在array中的等级。
The rank of an element is defined as the distance between the element with the first element of the array when the array is arranged in ascending order. If two or more are same in the array then their rank is also the same as the rank of the first occurrence of the element.
For Example: Let the given array arr[] = {2, 2, 1, 6}, then rank of elements is given by:
sorted array is:
arr[] = {1, 2, 2, 6}
Rank(1) = 1 (at index 0)
Rank(2) = 2 (at index 1)
Rank(2) = 2 (at index 2)
Rank(6) = 4 (at index 3)
例子:
Input: arr[] = [100, 5, 70, 2]
Output: [4, 2, 3, 1]
Explanation:
Rank of 2 is 1, 5 is 2, 70 is 3 and 100 is 4.
Input: arr[] = [100, 2, 70, 2]
Output: [3, 1, 2, 1]
Explanation:
Rank of 2 is 1, 70 is 2 and 100 is 3.
天真的方法:天真的方法是找到每个元素的等级为1 +当前元素数组中较小元素的数量。
时间复杂度: O(N 2 )
辅助空间: O(1)
高效方法:要优化上述幼稚方法,请找到元素的等级,然后将等级分配给这些元素。步骤如下:
- 要计算元素的等级,请首先复制给定的arr [],然后按升序对复制的数组进行排序。
- 然后遍历复制的数组,并通过使用rank变量将其等级放入HashMap中。
- 如果该元素已经存在于HashMap中,则不更新等级,否则更新该元素在HashMap中的等级以及递增rank变量。
- 遍历给定数组arr []使用存储在HashMap中的等级分配每个元素的等级。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function to assign rank to
// array eleements
void changeArr(int input[], int N)
{
// Copy input array into newArray
int newArray[N];
copy(input, input + N, newArray);
// Sort newArray[] in ascending order
sort(newArray, newArray + N);
int i;
// Map to store the rank of
// the array element
map ranks;
int rank = 1;
for(int index = 0; index < N; index++)
{
int element = newArray[index];
// Update rank of element
if (ranks[element] == 0)
{
ranks[element] = rank;
rank++;
}
}
// Assign ranks to elements
for(int index = 0; index < N; index++)
{
int element = input[index];
input[index] = ranks[input[index]];
}
}
// Driver code
int main()
{
// Given array arr[]
int arr[] = { 100, 2, 70, 2 };
int N = sizeof(arr) / sizeof(arr[0]);
// Function call
changeArr(arr, N);
// Print the array elements
cout << "[";
for(int i = 0; i < N - 1; i++)
{
cout << arr[i] << ", ";
}
cout << arr[N - 1] << "]";
return 0;
}
// This code is contributed by divyeshrabadiya07
Java
// Java program for the above approach
import java.util.*;
class GFG {
// Function to assign rank to
// array eleements
static void changeArr(int[] input)
{
// Copy input array into newArray
int newArray[]
= Arrays
.copyOfRange(input,
0,
input.length);
// Sort newArray[] in ascending order
Arrays.sort(newArray);
int i;
// Map to store the rank of
// the array element
Map ranks
= new HashMap<>();
int rank = 1;
for (int index = 0;
index < newArray.length;
index++) {
int element = newArray[index];
// Update rank of element
if (ranks.get(element) == null) {
ranks.put(element, rank);
rank++;
}
}
// Assign ranks to elements
for (int index = 0;
index < input.length;
index++) {
int element = input[index];
input[index]
= ranks.get(input[index]);
}
}
// Driver Code
public static void main(String[] args)
{
// Given array arr[]
int[] arr = { 100, 2, 70, 2 };
// Function Call
changeArr(arr);
// Print the array elements
System
.out
.println(Arrays
.toString(arr));
}
}
Python3
# Python3 program for the above approach
# Function to assign rank to
# array eleements
def changeArr(input1):
# Copy input array into newArray
newArray = input1.copy()
# Sort newArray[] in ascending order
newArray.sort()
# Dictionary to store the rank of
# the array element
ranks = {}
rank = 1
for index in range(len(newArray)):
element = newArray[index];
# Update rank of element
if element not in ranks:
ranks[element] = rank
rank += 1
# Assign ranks to elements
for index in range(len(input1)):
element = input1[index]
input1[index] = ranks[input1[index]]
# Driver Code
if __name__ == "__main__":
# Given array arr[]
arr = [ 100, 2, 70, 2 ]
# Function call
changeArr(arr)
# Print the array elements
print(arr)
# This code is contributed by chitranayal
C#
// C# program for the above approach
using System;
using System.Collections.Generic;
using System.Text;
class GFG{
// Function to assign rank to
// array eleements
static void changeArr(int[] input)
{
// Copy input array into newArray
int []newArray = new int[input.Length];
Array.Copy(input, newArray, input.Length);
// Sort newArray[] in ascending order
Array.Sort(newArray);
// To store the rank of
// the array element
Dictionary ranks= new Dictionary();
int rank = 1;
for(int index = 0;
index < newArray.Length;
index++)
{
int element = newArray[index];
// Update rank of element
if (!ranks.ContainsKey(element))
{
ranks[element] = rank;
rank++;
}
}
// Assign ranks to elements
for(int index = 0;
index < input.Length;
index++)
{
input[index] = ranks[input[index]];
}
}
// Driver Code
public static void Main(string[] args)
{
// Given array arr[]
int[] arr = { 100, 2, 70, 2 };
// Function call
changeArr(arr);
// Print the array elements
Console.WriteLine("[{0}]",
string.Join(", ", arr));
}
}
// This code is contributed by rutvik_56
[3, 1, 2, 1]
时间复杂度: O(N * log N)
辅助空间: O(N)