Off-by-one on range boundaries
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.
Move from brute-force thinking to an efficient approach using array strategy.
You are given a 2D integer array towers, where towers[i] = [xi, yi, qi] represents the coordinates (xi, yi) and quality factor qi of the ith tower.
You are also given an integer array center = [cx, cy] representing your location, and an integer radius.
A tower is reachable if its Manhattan distance from center is less than or equal to radius.
Among all reachable towers:
[-1, -1].(xi, yi) and (xj, yj) is |xi - xj| + |yi - yj|.
A coordinate [xi, yi] is lexicographically smaller than [xj, yj] if xi < xj, or xi == xj and yi < yj.
|x| denotes the absolute value of x.
Example 1:
Input: towers = [[1,2,5], [2,1,7], [3,1,9]], center = [1,1], radius = 2
Output: [3,1]
Explanation:
[1, 2, 5]: Manhattan distance = |1 - 1| + |2 - 1| = 1, reachable.[2, 1, 7]: Manhattan distance = |2 - 1| + |1 - 1| = 1, reachable.[3, 1, 9]: Manhattan distance = |3 - 1| + |1 - 1| = 2, reachable.All towers are reachable. The maximum quality factor is 9, which corresponds to tower [3, 1].
Example 2:
Input: towers = [[1,3,4], [2,2,4], [4,4,7]], center = [0,0], radius = 5
Output: [1,3]
Explanation:
[1, 3, 4]: Manhattan distance = |1 - 0| + |3 - 0| = 4, reachable.[2, 2, 4]: Manhattan distance = |2 - 0| + |2 - 0| = 4, reachable.[4, 4, 7]: Manhattan distance = |4 - 0| + |4 - 0| = 8, not reachable.Among the reachable towers, the maximum quality factor is 4. Both [1, 3] and [2, 2] have the same quality, so the lexicographically smaller coordinate is [1, 3].
Example 3:
Input: towers = [[5,6,8], [0,3,5]], center = [1,2], radius = 1
Output: [-1,-1]
Explanation:
[5, 6, 8]: Manhattan distance = |5 - 1| + |6 - 2| = 8, not reachable.[0, 3, 5]: Manhattan distance = |0 - 1| + |3 - 2| = 2, not reachable.No tower is reachable within the given radius, so [-1, -1] is returned.
Constraints:
1 <= towers.length <= 105towers[i] = [xi, yi, qi]center = [cx, cy]0 <= xi, yi, qi, cx, cy <= 1050 <= radius <= 105Problem summary: You are given a 2D integer array towers, where towers[i] = [xi, yi, qi] represents the coordinates (xi, yi) and quality factor qi of the ith tower. You are also given an integer array center = [cx, cy] representing your location, and an integer radius. A tower is reachable if its Manhattan distance from center is less than or equal to radius. Among all reachable towers: Return the coordinates of the tower with the maximum quality factor. If there is a tie, return the tower with the lexicographically smallest coordinate. If no tower is reachable, return [-1, -1]. The Manhattan Distance between two cells (xi, yi) and (xj, yj) is |xi - xj| + |yi - yj|. A coordinate [xi, yi] is lexicographically smaller than [xj, yj] if xi < xj, or xi == xj and yi < yj. |x| denotes the absolute value of x.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: Array
[[1,2,5],[2,1,7],[3,1,9]] [1,1] 2
[[1,3,4],[2,2,4],[4,4,7]] [0,0] 5
[[5,6,8],[0,3,5]] [1,2] 1
Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #3809: Best Reachable Tower
class Solution {
public int[] bestTower(int[][] towers, int[] center, int radius) {
int cx = center[0], cy = center[1];
int idx = -1;
for (int i = 0; i < towers.length; i++) {
int x = towers[i][0], y = towers[i][1], q = towers[i][2];
int dist = Math.abs(x - cx) + Math.abs(y - cy);
if (dist > radius) {
continue;
}
if (idx == -1 || towers[idx][2] < q
|| (towers[idx][2] == q
&& (x < towers[idx][0] || (x == towers[idx][0] && y < towers[idx][1])))) {
idx = i;
}
}
return idx == -1 ? new int[] {-1, -1} : new int[] {towers[idx][0], towers[idx][1]};
}
}
// Accepted solution for LeetCode #3809: Best Reachable Tower
func bestTower(towers [][]int, center []int, radius int) []int {
cx, cy := center[0], center[1]
idx := -1
for i, a := range towers {
x, y, q := a[0], a[1], a[2]
dist := abs(x-cx) + abs(y-cy)
if dist > radius {
continue
}
if idx == -1 ||
towers[idx][2] < q ||
(towers[idx][2] == q &&
(x < towers[idx][0] ||
(x == towers[idx][0] && y < towers[idx][1]))) {
idx = i
}
}
if idx == -1 {
return []int{-1, -1}
}
return []int{towers[idx][0], towers[idx][1]}
}
func abs(x int) int {
if x < 0 {
return -x
}
return x
}
# Accepted solution for LeetCode #3809: Best Reachable Tower
class Solution:
def bestTower(
self, towers: List[List[int]], center: List[int], radius: int
) -> List[int]:
cx, cy = center
idx = -1
for i, (x, y, q) in enumerate(towers):
dist = abs(x - cx) + abs(y - cy)
if dist > radius:
continue
if (
idx == -1
or towers[idx][2] < q
or (towers[idx][2] == q and towers[i][:2] < towers[idx][:2])
):
idx = i
return [-1, -1] if idx == -1 else towers[idx][:2]
// Accepted solution for LeetCode #3809: Best Reachable Tower
// Rust example auto-generated from java reference.
// Replace the signature and local types with the exact LeetCode harness for this problem.
impl Solution {
pub fn rust_example() {
// Port the logic from the reference block below.
}
}
// Reference (java):
// // Accepted solution for LeetCode #3809: Best Reachable Tower
// class Solution {
// public int[] bestTower(int[][] towers, int[] center, int radius) {
// int cx = center[0], cy = center[1];
// int idx = -1;
// for (int i = 0; i < towers.length; i++) {
// int x = towers[i][0], y = towers[i][1], q = towers[i][2];
// int dist = Math.abs(x - cx) + Math.abs(y - cy);
// if (dist > radius) {
// continue;
// }
// if (idx == -1 || towers[idx][2] < q
// || (towers[idx][2] == q
// && (x < towers[idx][0] || (x == towers[idx][0] && y < towers[idx][1])))) {
// idx = i;
// }
// }
// return idx == -1 ? new int[] {-1, -1} : new int[] {towers[idx][0], towers[idx][1]};
// }
// }
// Accepted solution for LeetCode #3809: Best Reachable Tower
function bestTower(towers: number[][], center: number[], radius: number): number[] {
const [cx, cy] = center;
let idx = -1;
for (let i = 0; i < towers.length; i++) {
const [x, y, q] = towers[i];
const dist = Math.abs(x - cx) + Math.abs(y - cy);
if (dist > radius) {
continue;
}
if (
idx === -1 ||
towers[idx][2] < q ||
(towers[idx][2] === q &&
(x < towers[idx][0] || (x === towers[idx][0] && y < towers[idx][1])))
) {
idx = i;
}
}
return idx === -1 ? [-1, -1] : [towers[idx][0], towers[idx][1]];
}
Use this to step through a reusable interview workflow for this problem.
Two nested loops check every pair or subarray. The outer loop fixes a starting point, the inner loop extends or searches. For n elements this gives up to n²/2 operations. No extra space, but the quadratic time is prohibitive for large inputs.
Most array problems have an O(n²) brute force (nested loops) and an O(n) optimal (single pass with clever state tracking). The key is identifying what information to maintain as you scan: a running max, a prefix sum, a hash map of seen values, or two pointers.
Review these before coding to avoid predictable interview regressions.
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.