给你一个下标从 0 开始、由 n 个整数组成的数组 arr 。
arr 中两个元素的 间隔 定义为它们下标之间的 绝对差 。更正式地,arr[i] 和 arr[j] 之间的间隔是 |i - j| 。
返回一个长度为 n 的数组 intervals ,其中 intervals[i] 是 arr[i] 和 arr 中每个相同元素(与 arr[i] 的值相同)的 间隔之和 。
注意:|x| 是 x 的绝对值。
示例 1:
输入:arr = [2,1,3,1,2,3,3]
输出:[4,2,7,2,4,4,5]
解释:
示例 2:
输入:arr = [10,5,10,10]
输出:[5,0,3,4]
解释:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
#define size 100
struct hash{
int val;
int index;
struct hash *next;
};
void add_hash( struct hash *h,int val,int index){
struct hash* p=(struct hash*)malloc(sizeof(struct hash));
p->val=val;
p->index=index;
p->next=h->next;
h->next=p;
}
int find_sum(struct hash *h,int val,int index){
struct hash *p=h->next;
int re=0;
while(p){
if(p->val==val){
re=re+abs(index-p->index);
}
p=p->next;
}
return re;
}
long long* getDistances(int* arr, int arrSize, int* returnSize){
struct hash *h=(struct hash*)malloc(sizeof(struct hash)*size);
long long* re=(long long*)malloc(sizeof(long long)*arrSize);
int i;
for(i=0;i<size;i++){
(h+i)->next=NULL;
}
for(i=0;i<arrSize;i++){
add_hash(h+(arr[i]%size),arr[i],i);
}
for(i=0;i<arrSize;i++){
re[i]=find_sum(h+(arr[i]%size),arr[i],i);
}
*returnSize=arrSize;
return re;
}