我直接给你 可提交 LeetCode 的 Java 完整题解 + 极简思路,这是 857 题标准最优解法(贪心 + 大顶堆)。

题目思路(一句话)

1. 每个工人有一个性价比: wage[i] / quality[i] ,必须按这个比值从小到大选工人。
2. 固定一个工人当“基准”(必须付他满薪),前面所有工人都可以按这个比例付钱。
3. 用大顶堆维护最小的 k 个 quality 之和,总和 × 当前基准比值 = 总成本,取最小。

完整 Java 代码

java

import java.util.*;

class Solution {
public double mincostToHireWorkers(int[] quality, int[] wage, int k) {
int n = quality.length;
int[][] workers = new int[n][2];

    for (int i = 0; i < n; i++) {
        workers[i][0] = quality[i];
        workers[i][1] = wage[i];
    }
    
    // 按 wage/quality 升序排序
    Arrays.sort(workers, (a, b) -> Double.compare((double)a[1]/a[0], (double)b[1]/b[0]));
    
    PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());
    long qualitySum = 0;
    double minCost = Double.POSITIVE_INFINITY;
    
    for (int[] w : workers) {
        int q = w[0];
        maxHeap.offer(q);
        qualitySum += q;
        
        // 只保留 k 个最小 quality
        if (maxHeap.size() > k) {
            qualitySum -= maxHeap.poll();
        }
        
        // 凑够 k 个就计算一次
        if (maxHeap.size() == k) {
            double ratio = (double)w[1] / w[0];
            minCost = Math.min(minCost, qualitySum * ratio);
        }
    }
    return minCost;
}

}

复杂度

  • 时间 O(n log n + n log k)
  • 空间 O(n)
    这是本题标准最优解,能直接 AC。

需要我给你讲每一步为什么这样写,或者给一个输入输出示例手动模拟吗?

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐