离散化模板题(重复元素离散化后的数字相同)题解

这是一个非常简单的离散化模板题,没有任何难度。之所以写这个题解,是为了加深对离散化的理解。

题目

题目链接

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

题目描述

现有数列 A1, A2, ⋯, An,数列中可能有重复元素。
现在要求输出该数列的离散化数列,重复元素离散化后的数字相同。

输入

第一行,一个整数 n。
第二行,n 个整数整数 A1, A2, ⋯, An。

输出

一行,包括 n 整数。表示数列对应的离散化数列,重复元素离散化后的数字相同。

样例输入

6
1 23424 242 65466 242 0

样例输出

1 3 2 4 2 0

数据范围

对于 50% 的数据,1 ≤ N ≤ 10^3。
对于 100% 的数据,1 ≤ N ≤ 10^5 , -10^9 ≤ Ai ≤ 10^9。

分析

样例分析

原始数据为:

1 23424 242 65466 242 0

排序后数据变为:

0 1 242 242 23424 65466

去重后数据变为:

0 1 242 23424 65466

最后通过二分查找得到对应的数据离散化索引。比如原始数据 242,在排序去重后的左边索引为 2;原始数据 23424,在排序去重后的左边索引为 3。这样对应的离散化后数据为:

1 3 2 4 2 0

思路

1、读入数据。

2、排序。

3、去重。

4、利用二分查找找到对应的索引。

如样例数据分析可以知道,我们需要一个辅助数组保存排序去重后的数据。

AC 参考代码

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

const int MAXN = 1e5+4;
int num[MAXN] = {};//开始保存原始数据,后面保存离散化数据
int aux[MAXN]  = {};//辅助数组,保存排序去重后数据

int main() {
    //读入数据
    int n;
    scanf("%d", &n);
    int i;
    for (i=0; i<n; i++) {
        scanf("%d", &num[i]);
        aux[i]=num[i];//写入到辅助数组
    }

    //排序
    sort(aux, aux+n);
    //去重
    int cnt = unique(aux, aux+n)-aux-1;

    //二分查找索引
    for (i=0; i<n; i++) {
        num[i] = lower_bound(aux, aux+cnt, num[i])-aux;
    }

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

    return 0;
}
发布了203 篇原创文章 · 获赞 101 · 访问量 104万+

猜你喜欢

转载自blog.csdn.net/justidle/article/details/104538993