力扣题号:454. 四数相加 II
一、题目描述
给你四个整数数组 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
三、求解思路
四、代码实现
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 99999999
// 自定义数组
typedef struct array {
int* arr = NULL;
int size = 0;
}Array;
// map元素
typedef struct map {
int key;
int value;
}MapNode;
// 自定义哈希map
typedef struct hash_map {
MapNode arr[1005];
}HashMap;
// 映射函数
void voidreflection(HashMap& H, int n) {
int n1 = n % 1000;
while (H.arr[n1].key != MAX && H.arr[n1].key != n) {
n1++;
n1 %= 1000;
}
if (H.arr[n1].key == n) { // 元素重复
H.arr[n1].value++;
return;
}
H.arr[n1].key = n;
H.arr[n1].value++;
}
// 查找哈希表中是否有该元素
int find(HashMap& H, int n) {
int n1 = n % 1000;
while (H.arr[n1].key != n && H.arr[n1].key != MAX) {
n1++;
n1 %= 1000;
}
if (H.arr[n1].key == n) {
return H.arr[n1].value;
}
return 0;
}
// 四数相加
int solution(Array& A, Array& B, Array& C, Array& D) {
HashMap map; // 自定义哈希表
for (int i = 0; i < 1005; i++) {
map.arr[i].key = MAX;
map.arr[i].value = 0;
}
for (int i = 0; i < A.size; i++) {
for (int j = 0; j < B.size; j++) {
voidreflection(map, A.arr[i] + B.arr[j]);
}
}
int count = 0; // 统计a+b+c+d = 0 出现的次数
for (int i = 0; i < C.size;i++) {
for (int j = 0; j < D.size; j++) {
count += find(map, 0 - (C.arr[i] + D.arr[j]));
}
}
return count;
}
// 打印数组
void Print(Array& A) {
for (int i = 0; i < A.size; i++) {
printf("-----");
}
printf("\n");
/*for (int i = 0; i < A.size; i++) {
printf("%5d", i);
}*/
//printf("\n");
for (int i = 0; i < A.size; i++) {
printf("%5d", A.arr[i]);
}
printf("\n");
for (int i = 0; i < A.size; i++) {
printf("-----");
}
printf("\n");
}
int main() {
// nums1 =[1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]
Array arr1, arr2, arr3, arr4;
int a1[] = { 1,2 };
int a2[] = { -2,-1 };
int a3[] = { -1,2 };
int a4[] = { 0,2 };
int a5[] = { 0 };
int a6[] = { 0 };
int a7[] = { 0 };
int a8[] = { 0 };
arr1.size = arr2.size = arr3.size = arr4.size = 2;
arr1.arr = a1;
arr2.arr = a2;
arr3.arr = a3;
arr4.arr = a4;
Print(arr1); Print(arr2); Print(arr3); Print(arr4);
// 四数相加
int count = 0;
count = solution(arr1,arr2,arr3,arr4);
printf("\n count = %2d\n\n", count);
// nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]
arr1.size = arr2.size = arr3.size = arr4.size = 1;
arr1.arr = a5;
arr2.arr = a6;
arr3.arr = a7;
arr4.arr = a8;
Print(arr1); Print(arr2); Print(arr3); Print(arr4);
count = solution(arr1, arr2, arr3, arr4);
printf("\n count = %2d\n\n", count);
return 0;
}