题目

点击前往

你正在玩一款电子游戏,在游戏中你需要保护城市免受怪物侵袭。给你一个下标从 0 开始且长度为 n 的整数数组 dist,其中 dist[i] 是第 i 个怪物与城市的初始距离(单位:米)。

怪物以恒定的速度走向城市。给你一个长度为 n 的整数数组 speed 表示每个怪物的速度,其中 speed[i] 是第 i 个怪物的速度(单位:米/分)。

怪物从 第 0 分钟时开始移动。你有一把武器,并可以选择在每一分钟的开始时使用,包括第 0 分钟。但是你无法在一分钟的中间使用武器。这种武器威力惊人,一次可以消灭任一还活着的怪物。

一旦任一怪物到达城市,你就输掉了这场游戏。如果某个怪物恰在某一分钟开始时到达城市,这会被视为输掉游戏,在你可以使用武器之前,游戏就会结束。

返回在你输掉游戏前可以消灭的怪物的最大数量。如果你可以在所有怪物到达城市前将它们全部消灭,返回 n

示例 1:

1
2
3
4
5
6
7
8
输入: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 个怪物都可以被消灭。

解题思路

  • 转换思路:
    • 在每一分钟均可消灭一只怪物
    • 计算出每一只怪物到达城市所需的时间(向上取整),并按照到达所需时间由快到慢进行排序,得到到达时间数组
    • 遍历整个数组:比较消灭怪物的时间点(数组下标)和怪物到达的时间点(数组下标对应的值)的大小
    • 需满足:怪物到达的时间点 小于等于 消灭怪物的时间点
    • 不满足的话返回当前数组下标
1
2
3
4
5
6
7
8
9
function eliminateMaximum(dist: number[], speed: number[]): number {
const timeList = dist.map((item, idx)=> Math.ceil(item / speed[idx])).sort((a, b) => a - b);
for(let i = 0; i < timeList.length; i++){
if(timeList[i] <= i){
return i;
}
}
return timeList.length;
};