1620 网络信号最好的坐标(枚举、字典)

1. 问题描述:

给你一个数组 towers 和一个整数 radius ,数组中包含一些网络信号塔,其中 towers[i] = [xi, yi, qi] 表示第 i 个网络信号塔的坐标是 (xi, yi) 且信号强度参数为 qi 。所有坐标都是在  X-Y 坐标系内的 整数 坐标。两个坐标之间的距离用 欧几里得距离 计算。
整数 radius 表示一个塔 能到达 的 最远距离 。如果一个坐标跟塔的距离在 radius 以内,那么该塔的信号可以到达该坐标。在这个范围以外信号会很微弱,所以 radius 以外的距离该塔是 不能到达的 。
如果第 i 个塔能到达 (x, y) ,那么该塔在此处的信号为 ⌊qi / (1 + d)⌋ ,其中 d 是塔跟此坐标的距离。一个坐标的 网络信号 是所有 能到达 该坐标的塔的信号强度之和。
请你返回 网络信号 最大的整数坐标点。如果有多个坐标网络信号一样大,请你返回字典序最小的一个坐标。
注意:
坐标 (x1, y1) 字典序比另一个坐标 (x2, y2) 小:要么 x1 < x2 ,要么 x1 == x2 且 y1 < y2 。
⌊val⌋ 表示小于等于 val 的最大整数(向下取整函数)。

示例 1:

输入:towers = [[1,2,5],[2,1,7],[3,1,9]], radius = 2
输出:[2,1]
解释:
坐标 (2, 1) 信号强度之和为 13
- 塔 (2, 1) 强度参数为 7 ,在该点强度为 ⌊7 / (1 + sqrt(0)⌋ = ⌊7⌋ = 7
- 塔 (1, 2) 强度参数为 5 ,在该点强度为 ⌊5 / (1 + sqrt(2)⌋ = ⌊2.07⌋ = 2
- 塔 (3, 1) 强度参数为 9 ,在该点强度为 ⌊9 / (1 + sqrt(1)⌋ = ⌊4.5⌋ = 4
没有别的坐标有更大的信号强度。

示例 2:

输入:towers = [[23,11,21]], radius = 9
输出:[23,11]

示例 3:

输入:towers = [[1,2,13],[2,1,7],[0,1,9]], radius = 2
输出:[1,2]

示例 4:

输入:towers = [[2,1,9],[0,1,9]], radius = 2
输出:[0,1]
解释:坐标 (0, 1) 和坐标 (2, 1) 都是强度最大的位置,但是 (0, 1) 字典序更小

1 <= towers.length <= 50
towers[i].length == 3
0 <= xi, yi, qi <= 50
1 <= radius <= 50

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/coordinate-with-maximum-network-quality

2. 思路分析:

① 一开始的时候想到的是暴力破解,依次计算塔中每一个坐标点的强度,然后在这些坐标点中选择强度那个最大的返回,但是后面提交上去发现有一个问题没有考虑到的是网络信号最强的点可能并不一定是在塔上的,比如towers = [[1, 0, 2], [0, 1, 2], [2, 1, 2], [1, 2, 2]],[-1,0,2]] radius = 1信号最强的点就不是在塔上的,而是在坐标(1, 1)处,所以上面的想法没有考虑完全的

② 后面想到:计算塔中的每一个坐标能够到达的点的网络信号强度,最后选择一个信号强度最大的坐标返回即可,我们可以使用字典来记录当前坐标的网络信号强度,键使用元组来表示对应的坐标,值表示当前坐标下的网络信号强度,这样我们可以枚举塔中的每一个坐标点然后计算当前的点能够到达的点的网络信号强度(每一次计算强度累加对应的值即可),这样就可以计算出塔中所有坐标能够到达所有的范围的点的网络强度了

3. 代码如下:

import collections
from math import sqrt
from typing import List


class Solution:
    def bestCoordinate(self, towers: List[List[int]], radius: int) -> List[int]:
        t = 0
        dic = collections.defaultdict(int)
        length = len(towers)
        for i in range(length):
            x, y = towers[i][0], towers[i][1]
            # 模拟在radius范围x, y坐标能够到达的点的坐标
            dic[(x, y)] += towers[i][2]  # 当前的点到达自己位置的强度
            t = max(t, dic[(x, y)])
            x1, x2, y1, y2 = max(x - radius, 0), min(x + radius, 50), max(y - radius, 0), min(y + radius, 50)
            for j in range(x1, x2 + 1):
                for k in range(y1, y2 + 1):
                    if j == x and y == k: continue
                    dis = (x - j) ** 2 + (y - k) ** 2
                    if sqrt(dis) <= radius:
                        dic[(j, k)] += int(towers[i][2] / (1 + sqrt(dis)))
                        t = max(t, dic[(j, k)])
        res, f = [0] * 2, 0
        if t == 0: return res
        for key, value in dic.items():
            if value == t and f == 0:
                res[0], res[1] = key[0], key[1]
                f = 1
            elif value == t and f and (key[0] < res[0] or (key[0] == res[0] and key[1] < res[1])):
                res[0], res[1] = key[0], key[1]
        return res

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值