前往
大廳
主題

LeetCode - 2249. Count Lattice Points Inside a Circle 解題心得

Not In My Back Yard | 2023-01-23 12:00:08 | 巴幣 0 | 人氣 170

題目連結:


題目意譯:
給定一個二維整陣列 circles,其中 circles[i] = [xi, yi, ri] 代表著畫在一個座標網格上的第 i 個圓之圓心 (xi, yi) 以及其半徑 ri。回傳位於至少一個圓之中的格子點(Lattice point)之總數。

注:
一個格子點為有著整數座標值的點。
座落於一圓的圓周上的點同樣也視為是位於圓中。

限制:
1 ≦ circles.length ≦ 200
circles[i].length == 3
1 ≦ xi, yi ≦ 100
1 ≦ ri ≦ min(xi, yi)



範例測資:
範例 1:
輸入: circles = [[2,2,1]]
輸出: 5
解釋:
上圖代表著給定的圓。
位於圓內的格子點為 (1, 2) 、 (2, 1) 、 (2, 2) 、 (2, 3) 和 (3, 2),並且在上圖中標以綠色。
其他的點,例如 (1, 1) 和 (1, 3),其在上圖中標以紅色,則不在圓內。
因此位於至少一個圓之中的格子點總數為 5。

範例 2:
輸入: circles = [[2,2,2],[3,4,1]]
輸出: 16
解釋:
上圖代表著給定的圓。
位於至少一個圓之中的格子點總數為 16 個。
例如說 (0, 2) 、 (2, 0) 、 (2, 4) 、 (3, 2) 和 (4, 4)。


解題思維:
根據題目的條件,我們可以看到我們只需要檢查最多 X 座標介於 0 ~ 200 且 Y 座標介於 0 ~ 200 的這些點,總計 40401 個點。而藉由先掃過一次每個圓 circles[i] = [xi, yi, ri],並看它們的
最左邊的點之 X 座標,即 (xi - ri)、
最右邊的點之 X 座標,即 (xi + ri)、
最上面的點之 Y 座標,即 (yi + ri)、
最下面的點之 Y 座標,即 (yi - ri)。
令 minX 為上述 X 座標最小的、maxX 為 X 座標最大的、minY 為 Y 座標最小的、maxY 為 Y 座標最大的。從我們可以只搜尋 X 座標介於 minX ~ maxX 且 Y 座標介於 minY ~ maxY 的這些點,進一步縮小範圍。

因此我們便可以直接窮舉這些點。對於每個點 (x, y),我們掃過一次所有的圓 circles[i] = [xi, yi, ri]。

當有一圓滿足 (x - xi) ^ 2 + (y - yi) ^ 2(即為點與圓心距離之平方) 小於等於 ri ^ 2 時,則代表該點位於此圓之中(至於不開平方根是因為開了平方根之後會產生不必要的浮點數誤差)。

由此便可以統計出有多少點位於任何一圓中,這些點的總數即為所求。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

相關創作

更多創作