1. 程式人生 > 其它 >b_lc_檢測正方形(先找對角點,然後判斷另外兩點)

b_lc_檢測正方形(先找對角點,然後判斷另外兩點)

設計一個演算法:

  • 新增 一個在資料流中的新點到某個資料結構中。可以新增 重複 的點,並會視作不同的點進行處理。
  • 給你一個查詢點,請你從資料結構中選出三個點,使這三個點和查詢點一同構成一個 面積為正 的 軸對齊正方形 ,統計 滿足該要求的方案數目。

軸對齊正方形 是一個正方形,除四條邊長度相同外,還滿足每條邊都與 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;
    }
};