lower_bound实现离散化

今天学习了一些新的东西,我也不知道该怎么说,突然发现离散化居然可以这么玩,还是非常有意思的,下面我先放一个传统的离散化代码,没有学过的同学们相信经过一番脑补也应该可以知道这个东西是用来干什么的,但是这不是我们今天的重点!

代码如下:

#include<bits/stdc++.h>
using namespace std;
struct sd{
    int val,loc;//val是值 loc是当前点的位置 
}x[100005]; 
bool cmp(sd a,sd b)
{
    if(a.val<b.val)
    return true;
}
int discretization[100005];//这单词真够长 
int main()
{
    std::ios::sync_with_stdio(false);
    int n;
    cin>>n;
    for(int i=1;i<=n;++i)
    {
        cin>>x[i].val;
        x[i].loc=i;
    }
    sort(x+1,x+n+1,cmp);
    int cnt=0; 
    x[0].val=891881292;//important!
    for(int i=1;i<=n;++i)
    {
        if(x[i-1].val==x[i].val)discretization[x[i].loc]=cnt;
        else 
        {
            cnt++;
            discretization[x[i].loc]=cnt;
        }
    } 
    for(int i=1;i<=n;++i)
    {
        cout<<discretization[i]<<" ";
    }
    return 0;
} 

是不是感觉思路虽然简单但是代码特别长······

所以今天我们的重点出来了如何用lower_bound来实现离散化操作。

没学过lower_bound的小朋友请戳这里☞lower_bound与upper_bound的使用注意事项

说白了一句话总结一下就是lower_bound返回的就是当前你要查找元素的第一个位置(注意:已经是排好了顺序的哦!!!)

所以说我们在这里实现这个操作就比较简单了,我们先把原数组复制到一个新的数组中,然后对新的数组实现排序和去重(没有学过去重吗?戳这里☞去重unique)的工作,最后我们把原数组中的每一个树依次用lower_bound来搜索他在新数组中的位置,最后我们在用这个位置信息更新一下原数组,那么一个离散化的操作就这样完成了,我再也不用写结构体啦!哈哈!

实现代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=100000;
int arr[N];
int xs[N],cnt=-1;
int n;
int main()
{
    std::ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;++i)
    {
        cin>>arr[i];
        cnt++;
        xs[cnt]=arr[i];
    } 
    sort(xs,xs+cnt);
    int e=unique(xs,xs+cnt)-xs;
    for(int i=1;i<=n;++i)
    {
        arr[i]=lower_bound(xs,xs+e,arr[i])-xs+1;  
    }
    for(int i=1;i<=n;++i)
    {
        cout<<arr[i]<<" "; 
    }
} 

谢谢采纳!

原文链接: https://www.cnblogs.com/mudrobot/p/13330848.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    lower_bound实现离散化

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/367563

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 下午5:51
下一篇 2023年3月2日 下午5:51

相关推荐