算法基础学习笔记——⑤离散化\区间和并

离散化是将大数据范围内的数值排序去重,映射到小范围内,常用于优化问题解决。文章提供了离散化的C++模板代码,包括二分查找实现。此外,还介绍了如何合并有交集的区间,给出区间合并的模板。这些是算法学习中的基础操作,适用于处理数组和区间问题。
摘要由CSDN通过智能技术生成

博主:命运之光
专栏:算法基础学习

目录

✨简述

特指整数离散化

🍓离散化模板:

✨区间和并

🍓区间和并模板:


前言:算法学习笔记记录日常分享,需要的看哈O(∩_∩)O,感谢大家的支持!


 ✨简述

离散化是一种辅助解决问题的操作,当问题中涉及的数据范围非常大,但是实际使用到的数据是比较少的。并且问题的求解是和它范围里的其它数据有关系的,那么可以将这些可能使用到的数据放到一起,排序去重,就将它们映射到了一个新的较小的范围里。

例如,下面几个数是在(−∞,∞)范围里的,实际用到的数:

6 、 − 10000 、 114514 、 1919 、 − 123 、 1919

排序之后变成:

− 10000 、 − 123 、 6 、 1919 、 1919 、 114514

去重之后变成:

− 10000 、 − 123 、 6 、 1919 、 114514

它在数组中的下标即可对应于一种离散化结果:

0 、 1 、 2 、 3 、 4

在有些问题(比如下面涉及前缀和操作的问题)里,需要下标从1开始,所以离散化结果也常常用从1开始的:

1 、 2 、 3 、 4 、 5

特指整数离散化

🍓离散化模板:

vector<int> alls; // 存储所有待离散化的值
sort(alls.begin(), alls.end()); // 将所有值排序
alls.erase(unique(alls.begin(), alls.end()), alls.end()); // 去掉重复元素
// 二分求出x对应的离散化的值
int find(int x) // 找到第一个大于等于x的位置
{
     int l = 0, r = alls.size() - 1;
     while (l < r)
     {
         int mid = l + r >> 1;
         if (alls[mid] >= x) r = mid;
         else l = mid + 1;
     }
     return r + 1; // 映射到1, 2, ...n
}

✨区间和并

很多区间如果有交集就把它们合并为一个区间

🍓区间和并模板:

// 将所有存在交集的区间合并
void merge(vector<PII> &segs)
{
     vector<PII> res;
     sort(segs.begin(), segs.end());
     int st = -2e9, ed = -2e9;
     for (auto seg : segs)
         if (ed < seg.first)
         {
             if (st != -2e9) res.push_back({st, ed});
             st = seg.first, ed = seg.second;
         }
         else ed = max(ed, seg.second);
     if (st != -2e9) res.push_back({st, ed});
     segs = res;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

命运之光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值