LeetCode 每日 1 题:N 次操作后的最大分数和

114 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 23 天,点击查看活动详情

N 次操作后的最大分数和

网络信号最好的坐标

给你一个数组 towers 和一个整数 radius

数组  towers  中包含一些网络信号塔,其中 towers[i]=[xi,yi,qi]towers[i] = [x_i, y_i, q_i] 表示第 i 个网络信号塔的坐标是 (xi,yi)(x_i, y_i) 且信号强度参数为 qiq_i 。所有坐标都是在  X-Y 坐标系内的 整数 坐标。两个坐标之间的距离用 欧几里得距离 计算。

整数 radius 表示一个塔 能到达 的 最远距离 。如果一个坐标跟塔的距离在 radius 以内,那么该塔的信号可以到达该坐标。在这个范围以外信号会很微弱,所以 radius 以外的距离该塔是 不能到达的 。

如果第 i 个塔能到达 (x, y) ,那么该塔在此处的信号为 qi/(1+d)⌊q_i / (1 + d)⌋ ,其中 d 是塔跟此坐标的距离。一个坐标的 信号强度 是所有 能到达 该坐标的塔的信号强度之和。

请你返回数组 [cx,cy][c_x, c_y] ,表示 信号强度 最大的 整数 坐标点 (cx,cy)(c_x, c_y) 。如果有多个坐标网络信号一样大,请你返回字典序最小的 非负 坐标。

注意:

  • 坐标 (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]
解释:坐标 (1, 2) 的信号强度最大。

提示:

  • 1 <= towers.length <= 50
  • towers[i].length == 3
  • 0<=xi,yi,qi<=500 <= x_i, y_i, q_i <= 50
  • 1 <= radius <= 50

思路分析

  1. 题目中的 欧几里得距离 计算就是在坐标系中两点之间的距离,两点坐标的横坐标差的平方加上纵坐标差的平方然后取平方根;
  2. 首先寻找 towers 坐标中的横坐标以及纵坐标的最大值 xMax 以及 yMax
  3. 然后针对寻找到的 xMax 以及 yMax 作为循环截止条件进行二重循环,然后遍历 towers 中各个坐标以及该坐标的信号强度值,寻找每个坐标的信号强度值;
  4. 每次循环结束都记录最大值,然后记录 cx 以及 cy,在循环结束后得到的就是信号强度最大的坐标值。

AC 代码

/**
 * @param {number[][]} towers
 * @param {number} radius
 * @return {number[]}
 */
var bestCoordinate = function(towers, radius) {
    let xMax = -1, yMax = -1
    
    for(const [x, y, q] of towers){
        xMax = Math.max(xMax, x)
        yMax = Math.max(yMax, y)
    }

    let maxSum = 0
    let cx = 0, cy = 0

    const calulate = (x1, y1, x2, y2) => {
        return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)
    }

    for(let i = 0; i <= xMax; i++) {
        for(let j = 0; j <= yMax; j++){
            let curSum = 0

            for(const [x, y, q] of towers) {
                const powDist = calulate(i, j, x, y)
                if(powDist <= radius * radius) {
                    const dist = Math.sqrt(powDist)
                    curSum += Math.floor(q / (1 + dist))
                }
            }

            if(curSum > maxSum){
                maxSum = curSum
                cx = i
                cy = j
            }
        }
    }

    return [cx, cy]
};

结果:

  • 执行结果: 通过
  • 执行用时:104 ms, 在所有 JavaScript 提交中击败了46.47%的用户
  • 内存消耗:43.8 MB, 在所有 JavaScript 提交中击败了29.35%的用户
  • 通过测试用例:100 / 100

END