b_lc_檢測正方形(先找對角點,然後判斷另外兩點)
阿新 • • 發佈:2021-09-19
設計一個演算法:
- 新增 一個在資料流中的新點到某個資料結構中。可以新增 重複 的點,並會視作不同的點進行處理。
- 給你一個查詢點,請你從資料結構中選出三個點,使這三個點和查詢點一同構成一個 面積為正 的 軸對齊正方形 ,統計 滿足該要求的方案數目。
軸對齊正方形 是一個正方形,除四條邊長度相同外,還滿足每條邊都與 x-軸 或 y-軸 平行或垂直。
思路:枚舉出所有add進去的對角的點,然後判斷其餘兩個點是否在容器中
class DetectSquares { public: map<pair<int, int>, int> cnt; DetectSquares() { } void add(vector<int> point) { cnt[{point[0], point[1]}]++; } int count(vector<int> point) { int ans = 0; int x = point[0], y = point[1]; for (const auto &[p, c] : cnt) { int x1 = p.first, y1 = p.second; if (x == x1 || y == y1) { continue; } if (abs(x - x1) == abs(y - y1)) { ans += c * cnt[{x, y1}] * cnt[{x1, y}]; } } return ans; } };