[toc] leetcode 1331. 数组序号转换
题目描述
- 数组序号转换
给你一个整数数组 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
解题思路
法1
排序+哈希
- 排序,
对数组排序,取排名
- 哈希:
建立哈希表,将排名储存到哈希表中(key为分数value为排名)
需要注意的是相同的分数算相同的排名
给原数组的数据排名
- 时间复杂度(O(nlogn))
- 空间复杂度(O(n))
执行结果
法1
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class Solution {
public int[] arrayRankTransform(int[] arr){
//申请副本
int[] arr2=arr.clone();
//排序
Arrays.sort(arr2);
// 创建一个Map对象
Map<Integer, Integer> map = new HashMap<>();
//map入值
//补差值(例如1,2,2(遇到相同的n++),3)(位次=i-n)
int n=0;
for (int i=0;i<arr.length;i++){
//为空赋值,否则n++
if (map.get(arr2[i])==null){
map.put(arr2[i], i-n+1);
}else {
n++;
}
}
//映射数据:
for (int i = 0; i < arr.length; i++) {
arr[i]=map.get(arr[i]);
}
//返回数据
return arr;
}
}
执行结果: 通过 显示详情 查看示例代码 添加备注
执行用时: 23 ms , 在所有 Java 提交中击败了 88.97% 的用户 内存消耗: 56.8 MB , 在所有 Java 提交中击败了 60.30% 的用户 通过测试用例: 38 / 38 炫耀一下:
本文由mdnice多平台发布