Leetcode 2013. 檢測正方形(Map)
阿新 • • 發佈:2022-01-26
給你一個在 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); */