LeetCode 1331. Rank Transform of an Array
原题链接在这里:https://leetcode.com/problems/rank-transform-of-an-array/description/
题目:
Given an array of integers arr
, replace each element with its rank.
The rank represents how large the element is. The rank has the following rules:
- Rank is an integer starting from 1.
- The larger the element, the larger the rank. If two elements are equal, their rank must be the same.
- Rank should be as small as possible.
Example 1:
Input: arr = [40,10,20,30] Output: [4,1,2,3] Explanation: 40 is the largest element. 10 is the smallest. 20 is the second smallest. 30 is the third smallest.
Example 2:
Input: arr = [100,100,100] Output: [1,1,1] Explanation: Same elements share the same rank.
Example 3:
Input: arr = [37,12,28,9,100,56,80,5,12] Output: [5,3,4,2,8,6,7,1,3]
Constraints:
0 <= arr.length <= 105
-109 <= arr[i] <= 109
题解:
To get the rank, we need to sort the array and put its value to rank into a map.
But we need to maintain the origianl index, thus we need to make a copy first.
Time Complexity: O(nlogn). n = arr.length.
Space: O(n).
AC Java:
1 class Solution { 2 public int[] arrayRankTransform(int[] arr) { 3 int[] arrCopy = Arrays.copyOf(arr, arr.length); 4 Arrays.sort(arrCopy); 5 Map<Integer, Integer> hm = new HashMap<>(); 6 for(int num : arrCopy){ 7 hm.putIfAbsent(num, hm.size() + 1); 8 } 9 10 for(int i = 0; i < arr.length; i++){ 11 arr[i] = hm.get(arr[i]); 12 } 13 14 return arr; 15 } 16 }