diff --git a/problems/0454.四数相加II.md b/problems/0454.四数相加II.md index 1c262c87..a0bf84da 100644 --- a/problems/0454.四数相加II.md +++ b/problems/0454.四数相加II.md @@ -412,6 +412,75 @@ public int FourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) { return res; } ``` +### C: + +```c +// 哈希表大小 +const int HASH_SIZE = 101; + +typedef struct node { + int val; + int count; + struct node *next; +} node, *HashMap; + +// 哈希表插入 +void hash_insert(HashMap hashmap[], int val) { + int idx = val < 0 ? (-val) % HASH_SIZE : val % HASH_SIZE, count = 0; + node *p = hashmap[idx]; + while (p->next != NULL) { + p = p->next; + if (p->val == val) { + (p->count)++; + return; + } + } + node *new = malloc(sizeof(node)); + new->val = val; + new->count = 1; + new->next = NULL; + p->next = new; + return; +} + +// 哈希表查找 +int hash_search(HashMap hashmap[], int val) { + int idx = val < 0 ? (-val) % HASH_SIZE : val % HASH_SIZE; + node *p = hashmap[idx]; + while (p->next != NULL) { + p = p->next; + if (p->val == val) return p->count; + } + return 0; +} + +int fourSumCount(int* nums1, int nums1Size, int* nums2, int nums2Size, int* nums3, int nums3Size, int* nums4, int nums4Size){ + // 初始化哈希表 + HashMap hashmap[HASH_SIZE]; + for (int i = 0; i < HASH_SIZE; i++) { + hashmap[i] = malloc(sizeof(node)); + hashmap[i]->next = NULL; + } + + // 统计两个数组元素之和的负值和出现的次数,放到哈希表中 + int count = 0, num; + for (int i = 0; i < nums1Size; i++) { + for(int j = 0; j < nums2Size; j++) { + num = - nums1[i] - nums2[j]; + hash_insert(hashmap, num); + } + } + + // 统计另外两个数组元素之和,查找哈希表中对应元素的出现次数,加入总次数 + for (int i = 0; i < nums3Size; i++) { + for(int j = 0; j < nums4Size; j++) { + num = nums3[i] + nums4[j]; + count += hash_search(hashmap, num); + } + } + return count; +} +```