454. 四数相加 II

1. 题号和题目名称

  1. 四数相加 II

2. 题目叙述

给你四个整数数组 nums1nums2nums3nums4 ,数组长度都是 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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

请向我看齐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值