🤡🤡🤡面试官:就你这还每天刷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对象来存储和的次数。

总结

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

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

往期推荐✨✨✨

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

相关推荐
weixin_470880267 分钟前
设计模式实战:自定义SpringIOC(亲手实践)
设计模式·面试·个人提升·springioc·设计模式实战·spring框架原理
天天摸鱼的java工程师1 小时前
Spring事务什么时候会失效?常见业务场景详解与修复方案
java·后端·面试
南篱1 小时前
JS 拷贝的"分身术":深拷贝 vs 浅拷贝
javascript·面试
吃着火锅x唱着歌2 小时前
LeetCode 1616.分割两个字符串得到回文串
算法·leetcode·职场和发展
孟大本事要学习2 小时前
算法第28天|动态规划:基础理论、斐波那契数、爬楼梯、使用最小花费爬楼梯
算法·动态规划
LastWhisperw2 小时前
音频算法基础(语音识别 / 降噪 / 分离)
算法·音视频·语音识别
lingling0092 小时前
艾利特机器人:光伏机器人如何重塑清洁能源制造新格局
大数据·人工智能·算法
流星白龙3 小时前
【C++算法】75.优先级队列_数据流中的第 K 大元素
开发语言·c++·算法