网络信号最好的坐标
问题描述:给你一个数组 towers 和一个整数 radius 。
数组 towers 中包含一些网络信号塔,其中 towers[i] = [xi, yi, qi] 表示第 i 个网络信号塔的坐标是 (xi, yi) 且信号强度参数为 qi 。所有坐标都是在 X-Y 坐标系内的 整数 坐标。两个坐标之间的距离用 欧几里得距离 计算。
整数 radius 表示一个塔 能到达 的 最远距离 。如果一个坐标跟塔的距离在 radius 以内,那么该塔的信号可以到达该坐标。在这个范围以外信号会很微弱,所以 radius 以外的距离该塔是 不能到达的 。
如果第 i 个塔能到达 (x, y) ,那么该塔在此处的信号为 ⌊qi / (1 + d)⌋ ,其中 d 是塔跟此坐标的距离。一个坐标的 信号强度 是所有 能到达 该坐标的塔的信号强度之和。
请你返回数组 [cx, cy] ,表示 信号强度 最大的 整数 坐标点 (cx, cy) 。如果有多个坐标网络信号一样大,请你返回字典序最小的 非负 坐标。
注意:
坐标 (x1, y1) 字典序比另一个坐标 (x2, y2) 小,需满足以下条件之一:
要么 x1 < x2 ,
要么 x1 == x2 且 y1 < y2 。
⌊val⌋ 表示小于等于 val 的最大整数(向下取整函数)。
问题求解;
class Solution {
public:
vector<int> bestCoordinate(vector<vector<int>>& towers, int radius) {
int maxq = 0, resx = 0, resy = 0;
for (int i = 0; i <= 50; i++) {
for (int j = 0; j <= 50; j++) {
int quality = 0;
for (auto tower : towers) {
int x = tower[0], y = tower[1], q = tower[2];
int d2 = (x - i) * (x - i) + (y - j) * (y - j);
if (d2 <= radius * radius) {
quality += (int)(q / (1 + sqrt(d2)));
}
}
// 因为我们是按照字典序遍历坐标的,所以第一个最大值一定是字典序最小的
if (maxq < quality) {
maxq = quality;
resx = i;
resy = j;
}
}
}
return {resx, resy};
}
};
问题总结:
老规矩我们先看一下官方求解。
方法一:枚举
首先遍历所有的信号塔,获得所有信号塔的 xx 坐标和 yy 坐标的最大值,分别记为 \textit{xMax}xMax 和 \textit{yMax}yMax。
在计算结果坐标 (c_x, c_y)(c
x
,c
y
) 之前,首先考虑 c_xc
x
和 c_yc
y
的取值范围。
假设坐标 (x_1, y_1)(x
1
,y
1
) 满足 x_1 > \textit{xMax}x
1
xMax 或 y_1 > \textit{yMax}y
1
yMax,考虑坐标 (x_2, y_2)(x
2
,y
2
),其中 x_2 = \min(x_1, \textit{xMax})x
2
=min(x
1
,xMax),y_2 = \min(y_1, \textit{yMax})y
2
=min(y
1
,yMax),则对于任意一个信号塔,该信号塔到坐标 (x_2, y_2)(x
2
,y
2
) 的距离一定小于等于到坐标 (x_1, y_1)(x
1
,y
1
) 的距离。由于一个信号塔在一个坐标的信号强度随着距离的增加而减少或不变,因此坐标 (x_1, y_1)(x
1
,y
1
) 处和坐标 (x_2, y_2)(x
2
,y
2
) 处的网络信号相比,一定是坐标 (x_2, y_2)(x
2
,y
2
) 处的网络信号更好或者两个坐标处的网络信号相同。由于题目要求返回字典序最小的网络信号最好的坐标,坐标 (x_2, y_2)(x
2
,y
2
) 的字典序一定小于坐标 (x_1, y_1)(x
1
,y
1
),因此坐标 (x_1, y_1)(x
1
,y
1
) 不可能是结果坐标。结果坐标一定满足 c_x \le \textit{xMax}c
x
≤xMax 且 c_y \le \textit{yMax}c
y
≤yMax。
假设坐标 (x_3, y_3)(x
3,y 3) 满足 x_3 < 0x 3
<0 或 y_3 < 0y 3
<0,考虑坐标 (x_4, y_4)(x
4
,y
4
),其中 x_4 = \max(x_3, 0)x
4
=max(x
3
,0),y_4 = \max(y_3, 0)y
4
=max(y
3
,0),则对于任意一个信号塔,由于信号塔的坐标非负,因此该信号塔到坐标 (x_4, y_4)(x
4
,y
4
) 的距离一定小于等于到坐标 (x_3, y_3)(x
3
,y
3
) 的距离。由于一个信号塔在一个坐标的信号强度随着距离的增加而减少或不变,因此坐标 (x_3, y_3)(x
3
,y
3
) 处和坐标 (x_4, y_4)(x
4
,y
4
) 处的网络信号相比,一定是坐标 (x_4, y_4)(x
4
,y
4
) 处的网络信号更好或者两个坐标处的网络信号相同。
根据题目要求,如果有多个网络信号最好的坐标,则返回网络信号最好的非负坐标,此时 c_x \ge 0c
x
≥0 且 c_y \ge 0c
y
≥0。如果只有一个网络信号最好的坐标,则根据上述分析可知,同样有 c_x \ge 0c
x
≥0 且 c_y \ge 0c
y
≥0。
因此结果坐标 (c_x, c_y)(c
x
,c
y
) 满足 0 \le c_x \le \textit{xMax}0≤c
x
≤xMax 且 0 \le c_y \le \textit{yMax}0≤c
y
≤yMax,只需要在 0 \le x \le \textit{xMax}0≤x≤xMax 且 0 \le y \le \textit{yMax}0≤y≤yMax 的范围中遍历每一个坐标,计算该坐标处接收到的所有网络信号塔的信号强度之和,即该坐标的网络信号。遍历全部坐标之后,即可得到网络信号最好的坐标。
为了确保结果坐标是字典序最小的网络信号最好的坐标,遍历时应分别将 xx 和 yy 从小到大遍历,只有当一个坐标的网络信号严格大于最好信号时才更新结果坐标。
特别地,当一个网络信号塔与当前坐标的距离大于阈值 \textit{radius}radius 时,该网络信号塔的信号不能到达当前信号,只有当距离不超过阈值 \textit{radius}radius 时才计算信号强度。
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/coordinate-with-maximum-network-quality/solution/wang-luo-xin-hao-zui-hao-de-zuo-biao-by-7x1qm/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。