Hard草稿★★★★★O(n log n) 時間 · O(n) 空間
HeapPriority QueueGreedySorting
Patterns⛰️ 堆・Top-K🪙 貪心🔢 排序後處理
尚未複習過

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

1383Maximum Performance of a TeamHeap / Priority QueueHardHeap / Priority Queue

n 個工程師,第 i 個工程師有速度 speed[i] 和效率 efficiency[i]。從中最多選 k 個工程師組成團隊,團隊表現 = 所選工程師速度總和 * 所選工程師效率最小值。回傳最大可能的團隊表現,結果對 10^9 + 7 取模。

Example:

Input: n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 2 Output: 60

Intuition

TIP

核心思路:依效率降序排序,遍歷時當前效率為最小值,用 Min Heap 維護速度最大的 k 個以最大化總和。

Approaches

1. Brute Force: Fix Min Efficiency, Top-k Speeds in Prefix — O(n² log n) / O(n)
  • Idea: 依效率降序,對每個工程師當「最小效率」,在其前綴中取速度最大的 k 個求和
  • Time: O(n² log n) - 每個 i 排序前綴速度
  • Space: O(n)
class Solution {
    fun maxPerformance(n: Int, speed: IntArray, efficiency: IntArray, k: Int): Int {
        val MOD = 1_000_000_007L
        val order = (0 until n).sortedByDescending { efficiency[it] }
        var ans = 0L
        for (i in order.indices) {
            val speeds = ArrayList<Int>()
            for (j in 0..i) speeds.add(speed[order[j]])
            speeds.sortDescending()
            var sum = 0L
            for (t in 0 until minOf(k, speeds.size)) sum += speeds[t]
            ans = maxOf(ans, sum * efficiency[order[i]])
        }
        return (ans % MOD).toInt()
    }
}
⭐ 2. Sorting + Min Heap — O(n log n) / O(n)
  • Idea: 依效率降序排序,遍歷時用 Min Heap 維護最大 k 個 speed,計算每個可能的表現值
  • Time: O(n log n) - 排序 + heap 操作
  • Space: O(n)
class Solution {
    fun maxPerformance(n: Int, speed: IntArray, efficiency: IntArray, k: Int): Int {
        val MOD = 1_000_000_007L
        val indices = (0 until n).sortedByDescending { efficiency[it] }
        val minHeap = PriorityQueue<Int>()
        var speedSum = 0L
        var result = 0L

        for (idx in indices) {
            minHeap.offer(speed[idx])
            speedSum += speed[idx]

            if (minHeap.size > k) {
                speedSum -= minHeap.poll()
            }

            result = maxOf(result, speedSum * efficiency[idx])
        }

        return (result % MOD).toInt()
    }
}

🔑 Takeaways