给你一个 n × m 的网格和一个整数 k。 一个放置在单元格 (r, c) 的传感器可以覆盖所有...
创建于:2025年8月16日
使用 GPT-5 Thinking 回答 Chat01
创建于:2025年8月16日
使用 GPT-5 Thinking 回答 Chat01
给你一个 n × m 的网格和一个整数 k。
一个放置在单元格 (r, c) 的传感器可以覆盖所有与 (r, c) 的切比雪夫距离不超过 k 的单元格。
两个单元格 (r1, c1) 和 (r2, c2) 之间的切比雪夫距离为 max(|r1 − r2|,|c1 − c2|)。
你的任务是返回覆盖整个网格所需传感器的最少数量。
示例 1:
输入: n = 5, m = 5, k = 1
输出: 4
解释:
在位置 (0, 3)、(1, 0)、(3, 3) 和 (4, 1) 放置传感器可以确保网格中的每个单元格都被覆盖。因此,答案是 4。
示例 2:
输入: n = 2, m = 2, k = 2
输出: 1
解释:
当 k = 2 时,无论传感器放在哪个位置,单个传感器都可以覆盖整个 2 * 2 的网格。因此,答案是 1。
提示:
1 <= n <= 10^3
1 <= m <= 10^3
0 <= k <= 10^3
class Solution {
public int minSensors(int n, int m, int k) {
} 解决这个问题,通过所有例子,并且不能超时
}
思路很简单:切比雪夫距离 ≤ k 的覆盖区就是以传感器为中心、边长为 的轴对齐正方形。因此要最少传感器数,就是用边长为 的小方块把 网格尽量紧密地平铺。行方向需要 个,列方向需要 个,总数为两者乘积。
用整数运算实现上取整:。
时间复杂度、空间复杂度均为 。
javaclass Solution { public int minSensors(int n, int m, int k) { int side = 2 * k + 1; // 每个传感器覆盖的正方形边长 int rows = (n + side - 1) / side; // 行方向需要的传感器数(上取整) int cols = (m + side - 1) / side; // 列方向需要的传感器数(上取整) return rows * cols; } }
你可以用下列用例快速自测:
minSensors(5, 5, 1) == 4
minSensors(2, 2, 2) == 1
minSensors(1, 1, 0) == 1
minSensors(3, 10, 1) == 4