#include <bits/stdc++.h>
using namespace std;
void fun1() {
// 有重复元素的离散化
vector<int> a = {20, 20, 30, 30, 15};
vector<int> t;
t = a;
sort(t.begin(), t.end());
// 需要先去重
int m = unique(t.begin(), t.end()) - t.begin();
for (int& x : a) {
x = lower_bound(t.begin(), t.begin()+m, x) - t.begin();
cout << x << " ";
}
}
void fun2() {
// 没有重复元素的离散化
vector<int> a = {1,23424,21472313246768,6594,95,0,65535313};
// 离散化之后的相对大小保持不变
// 离散化后变成 1,4,6,3,2,0,5
struct node {
int v, i;
bool operator < (const node& r) {
return v < r.v;
}
};
int n = a.size();
vector<node> b(n);
for (int i = 0; i < n; i++) {
b[i].v = a[i];
b[i].i = i;
}
sort(b.begin(), b.end());
vector<int> idx(n);
for (int i = 0; i < n; i++) {
idx[b[i].i] = i;
}
for (int i = 0; i < n; i++) {
cout << idx[i] << " ";
}
}
int main() {
fun2();
}
离散化的两种方法
最新推荐文章于 2025-03-29 16:34:49 发布