返回
我的前端刷题18:巧用哈希表解决四数之和问题
前端
2023-11-12 05:41:06
四数之和:征服 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;
};
结语
利用哈希表解决“四数之和”问题,不仅思路巧妙,而且代码实现也简洁明了。希望这篇博文能助你攻克难关。如果你有其他前端难题想挑战,欢迎随时和我分享,让我们携手进步,共同成长!
常见问题解答
-
如何避免哈希表的碰撞?
答:哈希表使用散列表来解决碰撞问题,将不同的键值对存储在不同的位置。 -
为什么使用主动语态?
答:主动语态使文章更加清晰直接,强调动作的执行者。 -
什么是修辞问题?
答:修辞问题是不需要回答的,用于引起思考或强调。 -
为什么不重复和无关的信息?
答:避免重复和无关的信息可以让文章更加简洁高效,避免冗余和干扰。 -
如何保持连贯性?
答:通过使用连词和过渡词,确保段落之间以及句子之间平滑衔接。