1331. Rank Transform of an Array
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:
Example 3:
Constraints:
0 <= arr.length <= 105
-109 <= arr[i] <= 109
Solution:
class Solution {
public int[] arrayRankTransform(int[] arr) {
int[] result = new int[arr.length];
PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> (a[1] - b[1]));
for (int i = 0; i < arr.length; i++){
pq.offer(new int[]{i, arr[i]});
}
int pre = Integer.MIN_VALUE;
int preCount = 0;
while(!pq.isEmpty()){
int[] cur = pq.poll();
int curIndex = cur[0];
int curNum = cur[1];
if (curNum == pre){
result[curIndex] = preCount;
pre = curNum;
}else{
// cur != pre
result[curIndex] = preCount + 1;
preCount = preCount + 1;
pre = curNum;
}
}
return result;
}
}
// TC: O(nlogn)
// SC: O(n)