[LeetCode Daily Question] - 1331. 配列のシリアル番号変換

[トピックカテゴリ] 1 つ

  • 分類する

2【問題難易度】

  • 単純

3 [トピック番号]

  • 1331. アレイのシリアル番号変換

4 【タイトル説明】

  • 整数配列 arr を指定した場合、配列内の各要素をソートされたシリアル番号に置き換えてください。
  • 序数は要素の大きさを表します。シリアル番号の規則は次のとおりです。
    • シリアル番号は1から始まります。
    • 要素が大きいほど、シーケンス番号も大きくなります。2 つの要素が等しい場合、それらの序数は同じになります。
    • 各数値の序数はできるだけ小さくする必要があります。

5 【トピック例】

  • 例 1:

    • 入力: arr = [40,10,20,30]
    • 出力: [4,1,2,3]
    • 説明: 40 は最大の要素です。10は最小の要素です。20 は 2 番目に小さい数です。30 は 3 番目に小さい数です。
  • 例 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]

6 [トピックプロンプト]

  • 0 < = arr 。長さ < = 1 0 5 0 <= arr.length <= 10^50<=ああ_ _ _ _ _<=1 05
  • − 1 0 9 < = arr [ i ] < = 1 0 9 -10^9 <= arr[i] <= 10^91 09<=a rr [ i ]<=1 09

7つの【問題解決アイデア】

  • ソート + ハッシュを使用する
  • まず元の配列をコピーし、次に元の配列を小さい順に並べ替えます。
  • 次に、ソートされた配列をハッシュします。key は配列値、val は配列値に対応するソートです。これにより、配列値の重複を排除し、各配列値に対応する配列添字を記録できます。
  • 最後に、コピーした配列を走査し、要素ごとにソートされた位置を取り出し、それを現在の値に設定します。
  • 最後に、コピーした配列を返します

8【時間周波数】

  • 時間計算量: O ( nlogn ) O(nlogn)O ( nログn )nn _ _nは受信配列の長さです
  • 空間の複雑さ: O ( n ) O(n)んんnは受信配列の長さです

9 [コード実装]

  1. Java言語バージョン
class Solution {
    
    
    public int[] arrayRankTransform(int[] arr) {
    
    
        int n = arr.length;
        int[] temp = new int[n];
        for(int i = 0;i < n;i++){
    
    
            temp[i] = arr[i];
        }
        Arrays.sort(arr);
        HashMap<Integer, Integer> map = new HashMap<>();
        for(int i = 0;i < n;i++){
    
    
            if(!map.containsKey(arr[i])){
    
    
                map.put(arr[i], map.size() + 1);
            }
        }
        for(int i = 0;i < n;i++){
    
    
            temp[i] = map.get(temp[i]);
        }
        return temp;
    }
}
  1. C言語版
typedef struct
{
    
    
    int key;
    int val;
    UT_hash_handle hh;
}HashItem;

int cmp(const void *a, const void *b)
{
    
    
    return *(int *)a - *(int *)b;
}

int* arrayRankTransform(int* arr, int arrSize, int* returnSize)
{
    
    
    int* sortArr = (int*)malloc(sizeof(int) * arrSize);
    int* res = (int*)malloc(sizeof(int) * arrSize);
    memcpy(sortArr, arr, sizeof(int) * arrSize);
    qsort(sortArr, arrSize, sizeof(int), cmp);
    HashItem *map = NULL;
    for(int i = 0;i < arrSize;i++)
    {
    
    
        HashItem *temp = NULL;
        HASH_FIND_INT(map, &sortArr[i], temp);
        if(temp == NULL)
        {
    
    
            temp = (HashItem *)malloc(sizeof(HashItem));
            temp->key = sortArr[i];
            temp->val = HASH_COUNT(map) + 1;
            HASH_ADD_INT(map, key, temp);
        }
    }
    for(int i = 0;i < arrSize;i++)
    {
    
    
        HashItem *temp = NULL;
        HASH_FIND_INT(map, &arr[i], temp);
        res[i] = temp->val;
    }
    *returnSize = arrSize;
    HashItem *cur, *temp;
    HASH_ITER(hh, map, cur, temp)
    {
    
    
        HASH_DEL(map, cur);
        free(cur);
    }
    free(sortArr);
    return res;
}
  1. Python言語バージョン
class Solution:
    def arrayRankTransform(self, arr: List[int]) -> List[int]:
        n = len(arr)
        temp = [0] * n
        for i in range(0, n):
            temp[i] = arr[i]
        arr.sort()
        map = {
    
    }
        for i in range(0, n):
            if arr[i] not in map:
                map[arr[i]] = len(map) + 1
        for i in range(0, n):
            temp[i] = map[temp[i]]
        return temp
  1. C++言語バージョン
class Solution {
    
    
public:
    vector<int> arrayRankTransform(vector<int>& arr) {
    
    
        int n = arr.size();
        vector<int> temp = arr;
        sort(arr.begin(), arr.end());
        unordered_map<int, int> map;
        for(int i = 0;i < n;i++){
    
    
            if(!map.count(arr[i])){
    
    
                map[arr[i]] = map.size() + 1;
            }
        }
        for(int i = 0;i < n;i++){
    
    
            temp[i] = map[temp[i]];
        }
        return temp;
    }
};

10【投稿結果】

  1. Java言語バージョン
    ここに画像の説明を挿入

  2. C言語版
    ここに画像の説明を挿入

  3. Python言語バージョン
    ここに画像の説明を挿入

  4. C++言語バージョン
    ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/IronmanJay/article/details/132309912