【Leetcode】1331. Rank Transform of an Array

题目地址:

https://leetcode.com/problems/rank-transform-of-an-array/

给定一个数组,要求将每个数映射成另一个(整)数,并满足下面条件:
1、从11开始;
2、保持大小关系不变;
3、所映射到的数要尽量小。

显然只需映射为其排名即可。最小的映射为11,然后次小的映射为22,以此类推。可以先拷贝原数组,然后对新拷贝的数组进行排序,并用哈希表记录每个数字的排名。代码如下:

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class Solution {
    public int[] arrayRankTransform(int[] arr) {
        if (arr == null || arr.length == 0) {
            return arr;
        }
        
        // 拷贝原数组,然后对其进行排序
        int[] res = Arrays.copyOf(arr, arr.length);
        Arrays.sort(res);
        
        // 用哈希表记录每个数字的排名,由小到大,由1到k
        int idx = 1;
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < res.length; i++) {
            if (!map.containsKey(res[i])) {
                map.put(res[i], idx++);
            }
        }
        
        // 将每个位置替换为其排名
        for (int i = 0; i < res.length; i++) {
            res[i] = map.get(arr[i]);
        }
        
        return res;
    }
}

时间复杂度O(nlogn)O(n\log n),空间O(n)O(n)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章