1921. 消灭怪物的最大数量
你正在玩一款电子游戏,在游戏中你需要保护城市免受怪物侵袭。给你一个 下标从 0 开始 且长度为 n
的整数数组 dist
,其中 dist[i]
是第 i
个怪物与城市的 初始距离(单位:米)。
怪物以 恒定 的速度走向城市。给你一个长度为 n
的整数数组 speed
表示每个怪物的速度,其中 speed[i]
是第 i
个怪物的速度(单位:米/分)。
怪物从 第 0 分钟 时开始移动。你有一把武器,并可以 选择 在每一分钟的开始时使用,包括第 0 分钟。但是你无法在一分钟的中间使用武器。这种武器威力惊人,一次可以消灭任一还活着的怪物。
一旦任一怪物到达城市,你就输掉了这场游戏。如果某个怪物 恰 在某一分钟开始时到达城市,这会被视为 输掉 游戏,在你可以使用武器之前,游戏就会结束。
返回在你输掉游戏前可以消灭的怪物的 最大 数量。如果你可以在所有怪物到达城市前将它们全部消灭,返回 n
。
示例 1:
输入:dist = [1,3,4], speed = [1,1,1] 输出:3 解释: 第 0 分钟开始时,怪物的距离是 [1,3,4],你消灭了第一个怪物。 第 1 分钟开始时,怪物的距离是 [X,2,3],你没有消灭任何怪物。 第 2 分钟开始时,怪物的距离是 [X,1,2],你消灭了第二个怪物。 第 3 分钟开始时,怪物的距离是 [X,X,1],你消灭了第三个怪物。 所有 3 个怪物都可以被消灭。
示例 2:
输入:dist = [1,1,2,3], speed = [1,1,1,1] 输出:1 解释: 第 0 分钟开始时,怪物的距离是 [1,1,2,3],你消灭了第一个怪物。 第 1 分钟开始时,怪物的距离是 [X,0,1,2],你输掉了游戏。 你只能消灭 1 个怪物。
示例 3:
输入:dist = [3,2,4], speed = [5,3,2] 输出:1 解释: 第 0 分钟开始时,怪物的距离是 [3,2,4],你消灭了第一个怪物。 第 1 分钟开始时,怪物的距离是 [X,0,2],你输掉了游戏。 你只能消灭 1 个怪物。
提示:
n == dist.length == speed.length
1 <= n <= 105
1 <= dist[i], speed[i] <= 105
原站题解
java 解法, 执行用时: 17 ms, 内存消耗: 53.3 MB, 提交时间: 2023-09-03 12:39:47
class Solution { public int eliminateMaximum(int[] dist, int[] speed) { int n = dist.length; int[] arrivalTimes = new int[n]; for (int i = 0; i < n; i++) { arrivalTimes[i] = (dist[i] - 1) / speed[i] + 1; } Arrays.sort(arrivalTimes); for (int i = 0; i < n; i++) { if (arrivalTimes[i] <= i) { return i; } } return n; } }
javascript 解法, 执行用时: 168 ms, 内存消耗: 53.1 MB, 提交时间: 2023-09-03 12:39:33
/** * @param {number[]} dist * @param {number[]} speed * @return {number} */ var eliminateMaximum = function(dist, speed) { const n = dist.length; const arrivalTimes = new Array(n).fill(0); for (let i = 0; i < n; i++) { arrivalTimes[i] = Math.ceil(dist[i] / speed[i]); } arrivalTimes.sort((a, b) => a - b); for (let i = 0; i < n; i++) { if (arrivalTimes[i] <= i) { return i; } } return n; };
golang 解法, 执行用时: 124 ms, 内存消耗: 9.5 MB, 提交时间: 2023-09-03 12:39:18
func eliminateMaximum(dist []int, speed []int) int { n := len(dist); arrivalTimes := make([]int, n) for i := 0; i < n; i++ { arrivalTimes[i] = (dist[i] - 1) / speed[i] + 1 } sort.Ints(arrivalTimes) for i := 0; i < n; i++ { if arrivalTimes[i] <= i { return i } } return n }
cpp 解法, 执行用时: 88 ms, 内存消耗: 79.6 MB, 提交时间: 2023-09-03 12:38:43
class Solution { public: int eliminateMaximum(vector<int> &dist, vector<int> &speed) { int n = dist.size(); // arr[i] 表示怪物到城池耗时为 i,如果耗时大于 n 的按照 n 计算 int arr[n + 1]; // 初始化数组 for (int i = 0; i <= n; ++i) arr[i] = 0; for (int i = 0; i < n; ++i) { // 怪物到城池的时间 int cost = (dist[i] + (speed[i] - 1)) / speed[i]; arr[min(n, cost)]++; } int add = 0; // add 表示击杀的后面的怪物数量 for (int i = 1; i < n; ++i) { // 当前时间点到达的怪物大于1,看之前的时间是否可以抵扣 if (arr[i] > 1) add -= (arr[i] - 1); // 之前的时间不能抵扣,直接返回 if (add < 0) return i; // 这个时间没有怪物到达,武器可以击杀后面的怪物 if (arr[i] == 0) ++add; } return n; } };
python3 解法, 执行用时: 120 ms, 内存消耗: 30.4 MB, 提交时间: 2023-09-03 12:38:00
class Solution: def eliminateMaximum(self, dist: List[int], speed: List[int]) -> int: arrivalTimes = sorted([(monsterDist - 1) // monsterSpeed + 1 for monsterDist, monsterSpeed in zip(dist, speed)]) for attackTime, arrivalTime in enumerate(arrivalTimes): if arrivalTime <= attackTime: return attackTime return len(arrivalTimes)
python3 解法, 执行用时: 212 ms, 内存消耗: 30.7 MB, 提交时间: 2023-09-03 12:37:25
class Solution: def eliminateMaximum(self, dist: List[int], speed: List[int]) -> int: rnd = Counter((x - 1) // y + 1 for x, y in zip(dist, speed)) acc = chain(accumulate(rnd[i] for i in range(len(dist))), [float('inf')]) return [max(i - x, -1) for i, x in enumerate(acc)].index(-1)