↓快轉到主要內容
  1. LeetCode/

LeetCode 3809: Best Reachable Tower

·1 分鐘· ·
LeetCode Medium Array
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2026-01-17

  • 提交紀錄:Accepted(一次通過)

解題思路
#

「品質最大,平手時座標字典序最小」可以合成一個 key:(-q, x, y) 取最小(Array 模板四)。只看曼哈頓距離 |x - cx| + |y - cy| <= radius 的塔,沒有就回傳 [-1, -1]。

我的解法
#

class Solution:
    def bestTower(self, towers: List[List[int]], center: List[int], radius: int) -> List[int]:
        cx, cy = center
        reachable = [(-q, x, y) for x, y, q in towers if abs(x - cx) + abs(y - cy) <= radius]
        if not reachable:
            return [-1, -1]
        _, x, y = min(reachable)
        return [x, y]

我當時用 if / elif 一個一個比較品質、x、y;用 tuple 當 key 比較不容易漏情況。

複雜度
#

時間 O(n),空間 O(n)。

要特別避免的錯誤
#

  • 品質要最大,所以 key 用 -q 才能跟座標一起取最小。

面試口說整理
#

我先留下距離在半徑內的塔,再用(負品質, x, y)取最小,品質最高、平手時座標最小的就會被選出來;沒有塔就回傳 [-1, -1]。時間 O(n)。

相關文章

LeetCode 3810: Minimum Operations to Reach Target Array
·1 分鐘
LeetCode Medium Greedy Hash-Table Array
LeetCode 3810 解題筆記:一次操作會把某個值的所有位置都改對,所以答案是不相等的位置上有幾種不同的值
LeetCode 2555: Maximize Win From Two Segments
·1 分鐘
LeetCode Medium Sliding-Window Binary-Search Array
LeetCode 2555 解題筆記:滑動視窗算出以每個獎品結尾的一段能拿幾個;同時記錄「前 i 個獎品裡一段最多拿幾個」,第二段就接在第一段左邊
LeetCode 1838: Frequency of the Most Frequent Element
·1 分鐘
LeetCode Medium Sliding-Window Sorting Greedy Prefix-Sum Binary-Search Array
LeetCode 1838 解題筆記:排序後,把視窗裡的數都加到 nums[right] 的花費是 nums[right] × 長度 − 視窗總和;花費 > k 就縮左邊
LeetCode 2271: Maximum White Tiles Covered by a Carpet
·1 分鐘
LeetCode Medium Sliding-Window Greedy Sorting Prefix-Sum Binary-Search Array
LeetCode 2271 解題筆記:地毯的左端放在某段白磚的起點一定不會更差;排序後用雙指針,完整蓋住的段累加,最後一段只算部分
LeetCode 3804: Number of Centered Subarrays
·1 分鐘
LeetCode Medium Hash-Table Enumeration Array
LeetCode 3804 解題筆記:固定左端點往右擴,邊加總邊把元素放進集合,總和在集合裡就算一個
LeetCode 2958: Length of Longest Subarray With at Most K Frequency
·1 分鐘
LeetCode Medium Sliding-Window Hash-Table Array
LeetCode 2958 解題筆記:「求最長」的滑動視窗,剛加入的數字出現超過 k 次就縮左邊