原文链接: https://leetcode-cn.com/problems/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:
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
中文题目
给你一个整数数组 arr
,请你将数组中的每个元素替换为它们排序后的序号。
序号代表了一个元素有多大。序号编号的规则如下:
- 序号从 1 开始编号。
- 一个元素越大,那么序号越大。如果两个元素相等,那么它们的序号相同。
- 每个数字的序号都应该尽可能地小。
示例 1:
输入:arr = [40,10,20,30] 输出:[4,1,2,3] 解释:40 是最大的元素。 10 是最小的元素。 20 是第二小的数字。 30 是第三小的数字。
示例 2:
输入:arr = [100,100,100] 输出:[1,1,1] 解释:所有元素有相同的序号。
示例 3:
输入:arr = [37,12,28,9,100,56,80,5,12] 输出:[5,3,4,2,8,6,7,1,3]
提示:
0 <= arr.length <= 105
-109 <= arr[i] <= 109
通过代码
高赞题解
解题思路
常规思路是数组去重后进行排序,然后迭代arr数组中的元素,在排序的数组中利用二分查找寻找索引值。
此处采用桶排序的思路,先遍历arr数组,找到数组中的最大值和最小值。
然后建立桶数组,将arr数组中出现过的元素在桶中设置为1。
接下来利用前缀和统计出每个元素前面出现过的次数,即该元素的序号。
代码
class Solution {
public int[] arrayRankTransform(int[] arr) {
int min = Integer.MAX_VALUE, max = Integer.MIN_VALUE;
for (int num : arr) {
if (num < min) min = num;
if (num > max) max = num;
}
int[] count = new int[max - min + 1];
for (int num : arr)
count[num - min] = 1;
int[] preSum = new int[count.length + 1];
for (int i = 1; i < preSum.length; i++)
preSum[i] = preSum[i - 1] + count[i - 1];
int[] ans = new int[arr.length];
int index = 0;
for (int num : arr)
ans[index++] = preSum[num - min] + 1;
return ans;
}
}
统计信息
通过次数 | 提交次数 | AC比率 |
---|---|---|
12518 | 23441 | 53.4% |
提交历史
提交时间 | 提交结果 | 执行时间 | 内存消耗 | 语言 |
---|