理论:
在解题过程中,有时我们存取数组里面的数据,比较大,但是后面我们解题不需要去使用这个数组里面的数据具体的数额,但是要用到它的大小关系,我们可以去把数组里面的数据变成1到n的范围。
#include<stdio.h>
#include<stdlib.h>
#define N 100005
int n;
int arr[N],p[N];
int cmp(const void*a,const void*b)//用于比较
{
return *(int *)a-*(int *)b;
}
int find(int x)//确定当前数据在数组里面的大小位置
{
int l=1,r=n;
while(l<r)//利用二分找到位置
{
int mid=(l+r)/2;
if(p[mid]>=x)r=mid;
else l=mid+1;
}
return r;
}
void work(int* a)
{
for(int i=1;i<=n;i++)p[i]=a[i];
qsort(p+1,n,sizeof(int),cmp);//将p数组进行排序
for(int i=1;i<=n;i++)a[i]=find(a[i]);//对于每一个arr[i]找到它在数组里面对应的大小
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&arr[i]);
work(arr);
return 0;
}
当我们数组里面的数据为9 5 6 3 7时,经过这样变换就变成了5 2 3 1 4,这在某些问题里面有很大的作用。