列表

详情


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 个怪物。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int eliminateMaximum(vector<int>& dist, vector<int>& speed) { } };

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)

上一题