Medium草稿★★★★★O(n log n) 時間 · O(n) 空間
GreedySorting
Patterns🪙 貪心🔢 排序後處理
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

1921Eliminate Maximum Number of MonstersGreedyMediumGreedy

n 個怪物正向城市靠近。第 i 個怪物距離 dist[i],速度 speed[i]。你有一把武器,每分鐘初可以消滅一個怪物(第 0 分鐘消滅第一個)。如果任何怪物到達城市則遊戲結束。回傳最多能消滅幾個怪物。

Example:

Input: dist = [1,3,4], speed = [1,1,1] Output: 3

Intuition

TIP

計算每個怪物的到達時間,貪心優先消滅最早到的。

Approaches

1. Greedy + Sort — O(n log n) / O(n)
  • Idea: 計算到達時間並排序,依序消滅,直到有怪物在消滅前到達。
  • Time: O(n log n)
  • Space: O(n)
class Solution {
    fun eliminateMaximum(dist: IntArray, speed: IntArray): Int {
        val n = dist.size
        val arrivalTimes = IntArray(n) { i ->
            (dist[i] + speed[i] - 1) / speed[i] // 向上取整
        }
        arrivalTimes.sort()

        for (i in 0 until n) {
            if (arrivalTimes[i] <= i) return i
        }
        return n
    }
}
⭐ 2. As Above (optimal) — O(n log n) / O(n)
  • Idea: 此題的貪心排序就是最優解,沒有更快的做法。
  • Time: O(n log n)
  • Space: O(n)
class Solution {
    fun eliminateMaximum(dist: IntArray, speed: IntArray): Int {
        val arrivals = IntArray(dist.size) { (dist[it] - 1) / speed[it] + 1 }
        arrivals.sort()
        for (i in arrivals.indices) {
            if (arrivals[i] <= i) return i
        }
        return arrivals.size
    }
}

🔑 Takeaways