算法:离散化模板

原理

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

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

比如: 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;
}
相关推荐
严肃小白兔6 小时前
MATLAB 数值计算中的精度与误差问题:浮点运算、误差传播与数值稳定性
人工智能·算法·matlab
青少儿编程课堂7 小时前
蓝桥杯青少组图形化省考报名倒计时·全国青少年信息素养大赛·电子学会图形化考级:校园黑白棋人机对战解析
c++·python·算法·bfs·信息学竞赛
jktantan8 小时前
注解式脱敏:用 Jackson 的 ContextualSerializer 做字段级策略(一)
spring boot·后端·算法·spring cloud·系统架构
Dream it possible!21 小时前
LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)
算法·leetcode·面试·动态规划
心抵鹊21 小时前
算法之双指针系列(一)
算法·leetcode
十二21 小时前
【洛谷题解】P1083 [NOIP 2012 提高组] 借教室(二分答案 + 差分)
数据结构·c++·算法·蓝桥杯
小此方1 天前
[算法实战论:动态规划]回文串问题的dp解法,回文串问题的母题,以及以此为基础的派生题
算法·动态规划
Pniubi1 天前
力扣560.和为k的子数组
算法·leetcode·职场和发展
D e re k ZH1 天前
C++ 从零入门(一):基础语法与程序结构
数据结构·c++·算法
Pniubi1 天前
力扣438.找到字符串中所有字母异位词
算法·leetcode·职场和发展