算法:离散化模板

原理

离散化是把无限空间中有限的个体映射到有限的连续区间 ,核心作用:去重 + 压缩坐标

当题目中数据范围很大,但是数据的总量不是很大,**并且我们需要用数据的值来映射数组的下标时,**我们就可以用离散化的思想先预处理一下所有的数据,使的每一个数据都映射成一个范围较小的值。

比如: 9, 99, 9999, 9999999 离散之后就变成 1, 2, 3, 4。

细节:离散化后只是让对应位置的元素有了新的下标

离散化模板

1.静态数组实现

cpp 复制代码
#include <bits/stdc++.h>

using namespace std;

#define int long long 
#define endl '\n'

const int N = 2e5 + 10; 
int n;
int a[N];
int t[N];
int pos; // 离散化后的大小
int find(int x)
{
	return lower_bound(t + 1, t + 1 + pos, x) - t; // 让下标从1开始
}

void solve()
{
	cin >> n;
	for(int i = 1; i <= n; i++)
	{
		cin >> a[i];
		t[i] = a[i];
	}
	// 排序 + 去重 
	sort(t + 1, t + 1 + n); // 排序 
	pos = unique(t + 1, t + 1 + n) - t - 1; // 去重
	for(int i = 1; i <= n; i++)
	{
		cout << find(a[i]) << endl; // 离散化后的结果 
	}
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int _ = 1;
	cin >> _;
	while(_--)
	{
		solve();
	}
	return 0;
}

不建议用unordered_map来离散化,有时候效率低,有被卡TLE

2.动态数组实现

cpp 复制代码
#include <bits/stdc++.h>

using namespace std;

#define int long long 
#define endl '\n'

void solve()
{
	int n; cin >> n;
	vector<int> a(n + 1);
	for(int i = 1; i <= n; i++)
	{
		cin >> a[i];
	}
	vector<int> t = a;
	sort(t.begin(), t.end()); // 排序 
	t.erase(unique(t.begin(), t.end()), t.end()); // 去重 	
	int pos = t.size();
	for(int i = 1; i <= n; i++)
	{
		cout << lower_bound(t.begin(), t.end(), a[i]) - t.begin() + 1 << endl;
	}
	
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int _ = 1;
	cin >> _;
	while(_--)
	{
		solve();
	}
	return 0;
}
相关推荐
HPtiger5 小时前
数据结构——选择排序
数据结构·算法·排序算法
康实训5 小时前
老年评估仿真实训平台架构设计与老年人能力评估实训室教学落地实践
大数据·人工智能·算法·实训室·实训室建设
DongQiShanRen5 小时前
六根硬件映射(四):归属澄清、两处不一致与卷十一总表
开发语言·人工智能·算法·rust·哈希算法·集成学习
CCblandy5 小时前
雪花 ID 四个边界实测:时钟回拨重号 500 个,前端 JSON.parse 直接丢精度
后端·python·算法·性能优化·架构
丑梨数据6 小时前
信创环境里跑文档工具:格式兼容与本地合规的几个坑
数据结构·人工智能·算法·决策树·排序算法
erzong2317 小时前
Linux操作系统:线程概念与控制
linux·算法
Nil2088 小时前
leetcode 5最长回文子串
算法·leetcode·职场和发展
xxwl5858 小时前
区域赛分类题解
c++·笔记·学习·算法
m0_674571978 小时前
力扣 hot 100 python
python·算法·leetcode
青少儿编程课堂9 小时前
蓝桥杯+全国青少年信息素养大赛+电子学会PythonC/C++考级:最长公共子序列LCS解析
c++·python·算法·bfs·信息学竞赛