【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)

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