2013. Detect Squares
題目網址:https://leetcode.cn/problems/detect-squares/
題意:給一在
X-Y
平面上的點所構成的 data stream。設計一個滿足下述要求的算法:
- 新增一個在 data stream 中的新點到某個資料結構中。可以新增重覆的點, 並且會被視作不同的點
- 給一查詢點, 從資料結構中選出三個點, 使這三點、查詢點構成一個面積為正的 axis-aligned square, 統計滿足該要求的方法數。
axis-aligned square 是一個正方形, 除了四條邊的長度相同外, 還滿足每條邊皆與
X軸
orY軸
平行或垂直。實現
DetectSquares
class:
DetectSquares()
:初始化DetectSquares
instancevoid add(int[] point)
:向資料結構新增一個新的點point = [x, y]
int count(int[] point)
:按上述方式統計與點point = [x, y]
共同構成 axis-aligned square 的方法數
Solution:
想法:若要建構一正方形, 要先找出 query node 的對角線上的點
(x3, y3)
, 便能形成正方形[(x1, y1), (x1, y3), (x3, y3), (x3, y1)]
。首先一一遍歷所有 node, 然後找出滿足符合條件的 query node 的對角線上的點(x3, y3)
, 並計算其方法數
class DetectSquares { |
- time:
DetectSquares()
:$O(1)$add()
:$O(1)$count()
:$O(n^2)$ ➔ for loop 遍歷所有點, 其中n
為點的個數
- space:$O(n)$ ➔
points
紀錄每個點, 其中n
為點的個數
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論