LeetCode 2013:检测正方形
基本思路
本题考察双哈希的使用方法,即第一重哈希以哈希表为值。这里将y坐标作为第一重哈希的关键字,将x坐标作为第二重哈希的关键字,将顶点数作为第二重哈希的值。
官方题解使用了这样一种双哈希表遍历方式,值得学习一下:
for (auto &[yKey, yKeyMap] : DualMap);
//DualMap为二重哈希表,yKey为第一重哈希表的关键字,yKeyMap为yKey对应的值,即一个哈希表。
代码
class DetectSquares {
public:
DetectSquares() {
}
void add(vector<int> point) {
int x = point[0];
int y = point[1];
DualMap[y][x]++;
}
int count(vector<int> point) {
int res = 0;
int x = point[0];
int y = point[1];
if(DualMap.count(y) == 0) return 0; //不存在同行元素,直接返回
auto& yMap = DualMap[y];
for (auto &[yKey, yKeyMap] : DualMap)
{
if(y == yKey) continue;
int d = y-yKey;
res += (yMap.count(x+d)? yMap[x+d]: 0) *
(yKeyMap.count(x)? yKeyMap[x]: 0) *
(yKeyMap.count(x+d)? yKeyMap[x+d]: 0);
res += (yMap.count(x-d)? yMap[x-d]: 0) *
(yKeyMap.count(x)? yKeyMap[x]: 0) *
(yKeyMap.count(x-d)? yKeyMap[x-d]: 0);
}
return res;
}
std::unordered_map<int ,std::unordered_map<int, int>> DualMap;
};