🤡🤡🤡面试官:就你这还每天刷leetcode?连四数相加和四数之和都分不清!

引言

大家好啊,我是前端拿破轮😁。

跟着卡哥学算法有一段时间了,通过代码随想录的学习,受益匪浅,首先向卡哥致敬🫡。

但是在学习过程中我也发现了一些问题,很多当时理解了并且AC的题目过一段时间就又忘记了,或者不能完美的写出来。根据费曼学习法 ,光有输入的知识掌握的是不够牢靠的,所以我决定按照代码随想录的顺序,输出自己的刷题总结和思考 。同时,由于以前学习过程使用的是JavaScript,而在2025年的今天,TypeScript几乎成了必备项,所以本专题内容也将使用TypeScript,来巩固自己的TypeScript语言能力。

题目信息

四数相加

leetcode题目链接

给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:

  • 0 <= i, j, k, l < n
  • nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

题目分析

本题乍看有点像四数之和,但是实际上两者的解题思路还是有很大不同的。关键就在于本体中的i,j,k,l是可以在不同的组合中重复出现的,比如对于一个四元组(0,0,0,0),i=0已经出现过,仍然可以统计形如(0, 1, 3, 4)的i为0的其他四元组。所以本体可以使用哈希表

类比两数之和,本题只需要先分组,总共四个数组,先分成两组。对于第一组,进行一次遍历求和,将和出现的次数存入map对象中,然后再遍历第二组,把和的相反数作为键去匹配map,将出现的次数进行累计统计,最后返回即可。

ts 复制代码
function fourSumCount(nums1: number[], nums2: number[], nums3: number[], nums4: number[]): number {
  // map对象,以两个数组遍历的和为键,以出现次数为值,存储前两个数组的遍历求和结果
  const map: Map<number, number> = new Map();

  // 遍历前两个数组
  for (const num1 of nums1) {
    for (const num2 of nums2) {
      const sum = num1 + num2;
      map.set(sum, (map.get(sum) || 0) + 1);
    }
  }

  // 统计结果
  let result = 0;

  // 遍历后两个数组
  for (const num3 of nums3) {
    for (const num4 of nums4) {
      const target = -(num3 + num4);
      result += map.get(target) || 0;
    }
  }

  return result;
}

时间复杂度: <math xmlns="http://www.w3.org/1998/Math/MathML"> O ( n 2 ) O(n^2) </math>O(n2).使用了两个嵌套循环,都是$$O(n^2)的时间复杂度。

空间复杂度:O(n),使用了一个map对象来存储和的次数。

总结

本题主要考查哈希表,四数相加要和三数之和和四数之和区分开来。本题使用哈希表,而后两者使用双指针。

好了,这篇文章就到这里啦,如果对您有所帮助,欢迎点赞,收藏,分享👍👍👍。您的认可是我更新的最大动力。由于笔者水平有限,难免有疏漏不足之处,欢迎各位大佬评论区指正。

往期推荐✨✨✨

我是前端拿破轮,关注我,和您分享前端知识,我们下期见!

相关推荐
纪元A梦5 小时前
贪心算法应用:化工反应器调度问题详解
算法·贪心算法
深圳市快瞳科技有限公司5 小时前
小场景大市场:猫狗识别算法在宠物智能设备中的应用
算法·计算机视觉·宠物
liulilittle6 小时前
OPENPPP2 —— IP标准校验和算法深度剖析:从原理到SSE2优化实现
网络·c++·网络协议·tcp/ip·算法·ip·通信
Haven-8 小时前
Java-面试八股文-JVM篇
java·jvm·面试
superlls8 小时前
(算法 哈希表)【LeetCode 349】两个数组的交集 思路笔记自留
java·数据结构·算法
田里的水稻9 小时前
C++_队列编码实例,从末端添加对象,同时把头部的对象剔除掉,中的队列长度为设置长度NUM_OBJ
java·c++·算法
纪元A梦9 小时前
贪心算法应用:保险理赔调度问题详解
算法·贪心算法
大前端helloworld9 小时前
从初中级如何迈入中高级-其实技术只是“入门卷”
前端·面试
Jayden_Ruan10 小时前
C++逆向输出一个字符串(三)
开发语言·c++·算法