1. 程式人生 > 其它 >Leetcode 2013. 檢測正方形(Map)

Leetcode 2013. 檢測正方形(Map)

給你一個在 X-Y 平面上的點構成的資料流。設計一個滿足下述要求的演算法:

新增 一個在資料流中的新點到某個資料結構中。可以新增 重複 的點,並會視作不同的點進行處理。
給你一個查詢點,請你從資料結構中選出三個點,使這三個點和查詢點一同構成一個 面積為正 的 軸對齊正方形 ,統計 滿足該要求的方案數目。
軸對齊正方形 是一個正方形,除四條邊長度相同外,還滿足每條邊都與 x-軸 或 y-軸 平行或垂直。

實現 DetectSquares 類:

DetectSquares() 使用空資料結構初始化物件
void add(int[] point) 向資料結構新增一個新的點 point = [x, y]
int count(int[] point) 統計按上述方式與點 point = [x, y] 共同構造 軸對齊正方形 的方案數。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/detect-squares
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

簡單模擬,直接map存一下每個位置的點的數量,統計的時候列舉邊長然後乘法原理計算並累加到答案即可。

class DetectSquares {
public:
    map<pair<int, int>, int> mp;
    DetectSquares() {

    }
    void add(vector<int> point) {
        pair<int, int> p = make_pair(point[0], point[1]);
        if(mp.find(p) != mp.end()) mp[p]++;
        else mp[p] = 1;
    }
    int count(vector<int> point) {
        int ans = 0;
        int nx = point[0], ny = point[1];
        for(int l = 1; l <= 1001; l++) {
            {
                pair<int, int> p1 = make_pair(nx, ny + l);
                pair<int, int> p2 = make_pair(nx + l, ny);
                pair<int, int> p3 = make_pair(nx + l, ny + l);
                if(mp.find(p1) != mp.end() && mp.find(p2) != mp.end() && mp.find(p3) != mp.end()) {
                    ans += mp[p1] * mp[p2] * mp[p3];
                }
            }
            {
                pair<int, int> p1 = make_pair(nx, ny - l);
                pair<int, int> p2 = make_pair(nx + l, ny - l);
                pair<int, int> p3 = make_pair(nx + l, ny);
                if(mp.find(p1) != mp.end() && mp.find(p2) != mp.end() && mp.find(p3) != mp.end()) {
                    ans += mp[p1] * mp[p2] * mp[p3];
                }
            }
            {
                pair<int, int> p1 = make_pair(nx - l, ny);
                pair<int, int> p2 = make_pair(nx - l, ny + l);
                pair<int, int> p3 = make_pair(nx, ny + l);
                if(mp.find(p1) != mp.end() && mp.find(p2) != mp.end() && mp.find(p3) != mp.end()) {
                    ans += mp[p1] * mp[p2] * mp[p3];
                }
            }
            {
                pair<int, int> p1 = make_pair(nx - l, ny - l);
                pair<int, int> p2 = make_pair(nx - l, ny);
                pair<int, int> p3 = make_pair(nx, ny - l);
                if(mp.find(p1) != mp.end() && mp.find(p2) != mp.end() && mp.find(p3) != mp.end()) {
                    ans += mp[p1] * mp[p2] * mp[p3];
                }
            }
        }
        return ans;
    }
};

/**
 * Your DetectSquares object will be instantiated and called as such:
 * DetectSquares* obj = new DetectSquares();
 * obj->add(point);
 * int param_2 = obj->count(point);
 */