题目描述:
给你一个数组 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的最大整数(向下取整函数)。
解题思路:
直接拿暴力法求解就好,因为题目中给了坐标的范围为[0,50]所以我们只需要开两个遍历,分别去求得各个点与传入信号塔之间的距离,然后判断该距离是否在信号覆盖范围内,若在即通过公式算出信号强度进行一个叠加,然后将叠加后的值与当前信号最强值比较,若大于信号最强值,则更新坐标为当前坐标。最终返回遍历完后的最大值坐标即为最终解。
代码:
class Solution: def bestCoordinate(self, towers: list[list[int]], radius: int) -> list[int]: max = 0 ans = [0, 0] for i in range(51): for j in range(51): t = 0 for x, y, q in towers: d = ((x - i) ** 2 + (y - j) ** 2) ** 0.5 if d <= radius: t += (q // (1 + d)) if t > max: max = t ans = [i, j] return ans if __name__ == '__main__': result = Solution().bestCoordinate(towers=[[1, 2, 13], [2, 1, 7], [0, 1, 9]], radius=2) print(result)