離散化模板題(重複元素離散化後的數字不同)題解

這是一個非常簡單的離散化模板題,沒有任何難度。之所以寫這個題解,是爲了加深對離散化的理解。

題目

題目鏈接

我的OJ,http://47.110.135.197/problem.php?id=5238

題目描述

現有數列 A1, A2, ⋯, An,數列中可能有重複元素。
現在要求輸出該數列的離散化數列,重複元素離散化後的數字不同。

輸入

第一行,一個整數 n。
第二行,n 個整數整數 A1, A2, ⋯, An。

輸出

一行,包括 n 整數。表示數列對應的離散化數列,重複元素離散化後的數字不同。

樣例輸入

6
1 23424 242 65466 242 0

樣例輸出

1 4 2 5 3 0

數據範圍

對於 50% 的數據,1 ≤ N ≤ 10^3。
對於 100% 的數據,1 ≤ N ≤ 10^5 , -10^9 ≤ Ai ≤ 10^9。

分析

由於相同的元素離散化後數字不同,所以需要記錄原有數據索引,然後在遍歷真個排序後數據,進行離散化

樣例分析

原始數據爲:

data: 1 23424 242 65466 242 0
index:0     1   2     3   4 5

排序後數據變爲:

data:  0 1 242 242 23424 65466
index: 5 0   2   4     1     3

最後通過逐一遍歷排序後的數據,得到數據離散化索引。比如原始數據 23424,爲第 4 大數據,所以離散化後的值爲 4;原始數據第一個 242,爲第 2 大數據,所以離散化後的值爲 2。這樣對應的離散化後數據爲:

1 4 2 5 3 0

思路

1、讀入數據。

2、排序。

3、遍歷數組建立離散化對應的索引。

如樣例數據分析可以知道,我們需要保存原數據的索引。因此我們可以定義一個結構體來實現。

AC 參考代碼

#include <bits/stdc++.h>
using namespace std;

struct NODE {
    int data;//數據
    int id;//索引
};

const int MAXN = 1e5+4;
NODE num[MAXN] = {};//保存原始數據
int lsh[MAXN]  = {};//離散化後數據

bool mycmp(const NODE &x, const NODE &y) {
    return x.data < y.data;
}

int main() {
    //讀入數據
    int n;
    scanf("%d", &n);
    int i;
    for (i=0; i<n; i++) {
        scanf("%d", &num[i].data);
        num[i].id=i;//建立索引
    }

    //排序
    sort(num, num+n, mycmp);

    //遍歷建立離散化索引
    for (i=0; i<n; i++) {
        lsh[num[i].id] = i;
    }

    //打印輸出
    for (i=0; i<n; i++) {
        printf("%d ", lsh[i]);
    }
    printf("\n");

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