1. 哈希表与双指针法实战解析
今天我想和大家分享几个LeetCode上经典的哈希表和双指针算法题目解法。这些题目看似简单,但其中蕴含着很多值得深入探讨的算法技巧和优化思路。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 四数相加II的哈希表解法
2.1 问题描述与基本思路
454题要求我们计算四个数组中各取一个数相加等于0的组合数。最直观的暴力解法是四重循环,时间复杂度高达O(n⁴),这在n=200时显然不可行。
更聪明的做法是将问题分解为两个部分:
- 先计算A和B数组所有可能的和,并统计每个和出现的次数
- 然后计算C和D数组所有可能的和,查找是否有对应的负数存在
这种分治思想将时间复杂度降低到了O(n²),空间复杂度也是O(n²)。
2.2 代码实现细节
cpp复制class Solution {
public:
int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C,
vector<int>& D) {
unordered_map<int, int> umap; // key:a+b的数值,value:a+b数值出现的次数
for (int a : A) {
for (int b : B) {
umap[a + b]++;
}
}
int count = 0;
for (int c : C) {
for (int d : D) {
if (umap.find(0 - (c + d)) != umap.end()) {
count += umap[0 - (c + d)];
}
}
}
return count;
}
};
这里有几个关键点需要注意:
- 使用unordered_map而不是map,因为前者基于哈希表实现,查找时间复杂度为O(1)
- 在统计A+B和时
