豆包 LeetCode 857.雇佣K名工人最低成本 public double mincostToHireWorkers(int[] quality, int[] wage, int k)
我直接给你 可提交 LeetCode 的 Java 完整题解 + 极简思路,这是 857 题标准最优解法(贪心 + 大顶堆)。1. 每个工人有一个性价比: wage[i] / quality[i] ,必须按这个比值从小到大选工人。3. 用大顶堆维护最小的 k 个 quality 之和,总和 × 当前基准比值 = 总成本,取最小。2. 固定一个工人当“基准”(必须付他满薪),前面所有工人都可以按这个
·
我直接给你 可提交 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。
需要我给你讲每一步为什么这样写,或者给一个输入输出示例手动模拟吗?
更多推荐




所有评论(0)