在我們只需要利用數值之間的大小關係,而不需要其具體值來進行運算的時候。對數據進行離散化操作,可以解決因爲數據範圍太大而造成的一些尷尬(比如數組,線段樹,樹狀數組因爲數據範圍太大,可能會難以操作或者超時),或者節約程序運行的時間。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int const N=1e5+5;
int a[N],b[N];
int main(){
int i,n;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(a,a+n);
int len=unique(a,a+n)-a;//unique去重使大小與下標對應,並得到去重後的長度
for(i=1;i<=n;i++)
b[i]=lower_bound(a,a+len,b[i])-a;//用lower_bound O(log n)查找比for O(n)更快
//b【】就是離散化後的數組了
for(i=1;i<=n;i++)printf("%d ",b[i]);
}