离散化
背景引入
对于一个数字序列,如果我们只关心他们之间的相对大小,而不关心具体数值,并且直接使用原数值会对我们的解决方案产生影响,此时我们采用离散化
具体步骤
即将一个原数组映射到另一个等大的数组中,并且两个数组数字之间的大小关系不变
如:原序列= [ 12 4 80 7 6 11 4 5*10e10] 可以映射成: [5 1 6 3 2 4 1 7]
代码详解
#include <algorithm>
#include <iostream>
using namespace std;
bool cmp(int a, int b) {
return a < b;
}
int main() {
int n = 8;
int arr[] = {12, 4, 80, 7, 6, 11, 4, int(5 * 10e10)};
int sorted[n];
copy(arr, arr + n, sorted);
sort(sorted, sorted + n, cmp);
for (int i = 0; i < n; i++) {
arr[i] = lower_bound(sorted, sorted + n, arr[i]) - sorted + 1;
}
return 0;
}
解释
在上述代码中,我们先构建了一个原数组的排序,即sorted = [4 4 6 7 11 12 80 5*10e10]
通过代码
for (int i = 0; i < n; i++) {
arr[i] = lower_bound(sorted, sorted + n, arr[i]) - sorted + 1;
}
我们先获得的arr[i]在sorted中的第一个不大于它的迭代器(指针),比如对于arr[i]=7,先返回指向sorted中的7的指针,减去sorted就会得到7在sorted中的位置n,即*(sorted+n) = 7,再加一就得到是第几个数字,这样就可以把原数组映射到一个连续且等于其长度的数组中了