1. 题号和题目名称
- 四数相加 II
2. 题目叙述
给你四个整数数组 nums1
、nums2
、nums3
和 nums4
,数组长度都是 n
,请你计算有多少个元组 (i, j, k, l)
能满足:
0 <= i, j, k, l < n
nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0
示例 1:
输入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]
输出:2
解释:
两个元组如下:
1. (0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 0
2. (1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0
示例 2:
输入:nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]
输出:1
3. 模式识别
本题可通过将四数相加转化为两数相加的组合问题来解决。先计算前两个数组中元素两两相加的和及其出现次数,再计算后两个数组中元素两两相加的和,查找其相反数在前两个数组和的统计中出现的次数。
4. 考点分析
- 哈希表的应用:利用哈希表存储前两个数组元素两两相加的和及其出现次数,可快速查找后两个数组和的相反数的出现次数。
- 组合思想:将四数相加拆分为两组两数相加,降低时间复杂度。
5. 所有解法
- 暴力枚举法:四重循环遍历四个数组,时间复杂度为 O(n4)O(n^4)O(n4),效率较低。
- 哈希表优化法:将前两个数组元素两两相加的和及其出现次数存入哈希表,再遍历后两个数组,查找相反数的出现次数,时间复杂度为 O(n2)O(n^2)O(n2),是本题的最优解法。
6. 最优解法(哈希表优化法)的 C 语言代码
#include <stdio.h>
#include <stdlib.h>
// 定义哈希表节点结构体
typedef struct HashNode {
int key; // 键,存储两数之和
int val; // 值,存储该和出现的次数
struct HashNode *next; // 指向下一个节点的指针,用于处理哈希冲突
} HashNode;
// 定义哈希表结构体
typedef struct {
HashNode **table; // 哈希表数组
int size; // 哈希表大小
} HashMap;
// 创建新的哈希表节点
HashNode* createHashNode(int key, int val) {
HashNode *node = (HashNode*)malloc(sizeof(HashNode));
node->key = key;
node->val = val;
node->next = NULL;
return node;
}
// 创建新的哈希表
HashMap* createHashMap(int size) {
HashMap