返回

我的前端刷题18:巧用哈希表解决四数之和问题

前端

四数之和:征服 LeetCode 18 的哈希表技巧

引言

在前端开发的旅途中,我们不可避免地会遇到难题。而刷题,尤其是深入 LeetCode 题库的经典题目,便是攻克这些难题的利器。今天,我们齐聚一堂,共同挑战 LeetCode 第 18 题——“四数之和”。

题目解析

题目要求我们从一个包含 n 个整数的数组 nums 中,找出不重复的四元组 [nums[i], nums[j], nums[k], nums[l]],满足以下条件:

  • 0 <= i, j, k, l < n
  • i != j != k != l
  • nums[i] + nums[j] + nums[k] + nums[l] == target

哈希表的妙用

解决本题的关键在于哈希表,一种神奇的数据结构,它允许我们通过键值对存储数据。本例中,我们将两个数的和作为键,并将包含这两个数的索引作为值。

首先,遍历数组,将所有两数之和存入哈希表。然后,再次遍历数组,检查哈希表中是否存在 target - nums[i]。若存在,则找到了一个满足条件的四元组。

为了避免重复,在将两数之和存入哈希表前,先检查它是否已存在。若存在,说明已找到一个满足条件的四元组,无需再次存储。

代码示例

/**
 * 找出满足以下条件且不重复的四元组[nums[i], nums[j], nums[k], nums[l]]:
 * 0 <= i, j, k, l < n
 * i != j != k != l
 * nums[i] + nums[j] + nums[k] + nums[l] == target
 *
 * @param {number[]} nums
 * @param {number} target
 * @return {number[][]}
 */
const fourSum = (nums, target) => {
  const result = [];
  const seen = {};

  for (let i = 0; i < nums.length; i++) {
    for (let j = i + 1; j < nums.length; j++) {
      const sum = nums[i] + nums[j];
      const complement = target - sum;

      if (seen[complement]) {
        for (const [k, l] of seen[complement]) {
          if (i !== k && i !== l && j !== k && j !== l) {
            result.push([nums[i], nums[j], nums[k], nums[l]]);
          }
        }
      }

      if (!seen[sum]) {
        seen[sum] = [];
      }
      seen[sum].push([i, j]);
    }
  }

  return result;
};

结语

利用哈希表解决“四数之和”问题,不仅思路巧妙,而且代码实现也简洁明了。希望这篇博文能助你攻克难关。如果你有其他前端难题想挑战,欢迎随时和我分享,让我们携手进步,共同成长!

常见问题解答

  1. 如何避免哈希表的碰撞?
    答:哈希表使用散列表来解决碰撞问题,将不同的键值对存储在不同的位置。

  2. 为什么使用主动语态?
    答:主动语态使文章更加清晰直接,强调动作的执行者。

  3. 什么是修辞问题?
    答:修辞问题是不需要回答的,用于引起思考或强调。

  4. 为什么不重复和无关的信息?
    答:避免重复和无关的信息可以让文章更加简洁高效,避免冗余和干扰。

  5. 如何保持连贯性?
    答:通过使用连词和过渡词,确保段落之间以及句子之间平滑衔接。