思路 前两个数组和进入MAP 并对同键值的权重进行++]
再将后两个的和的负数 在MAP查找 累积所有键值
typedef struct Map
{
int key;
int val;//int val=0;结构体内无法赋值
UT_hash_handle hh;
}myMap;
myMap *Map;
myMap *find(int ikey)
{
myMap *tmp;
HASH_FIND_INT(Map,&ikey,tmp);
return tmp;
}
void insert(int ikey)
{
myMap *s = find(ikey);
if(!s)//说明键值不在集合中
{
myMap *tmp =(myMap *) malloc(sizeof(myMap));
tmp->key =ikey;
tmp->val=1;
HASH_ADD_INT(Map,key,tmp);//注意这里为key
}
else s->val= (s->val)+1;
return;
}
int fourSumCount(int* nums1, int nums1Size, int* nums2, int nums2Size, int* nums3, int nums3Size, int* nums4, int nums4Size){
int i,j,asumb,csumd;
int cnt =0;
int cnt1;
for(i=0;i<nums1Size;i++)
{
for(j=0;j<nums2Size;j++)
{
asumb = nums1[i]+nums2[j];
insert(asumb);
}
}
cnt1 =HASH_COUNT(Map);
//("cnt是:%d\n",cnt1);
for(i=0;i<nums3Size;i++)
{
for(j=0;j<nums4Size;j++)
{
csumd=0-nums3[i]-nums4[j];
//printf("%d \n",csumd);
myMap *q=find(csumd);
if(q) cnt=cnt+(q->val);
}
}
return cnt;
}
错误 全局变量需要初始化!!!