Time Complexity: O(NlogN), where N is the number of workers. 先排序 O(NlogN), 外层循环 O(N),内层Heap操作O(logK)
Space Complexity:O(N).
33 ms, faster than 83.03%
class Solution {
class Worker implements Comparable<Worker> {
int wage;
int quality;
public Worker(int q, int w) {
quality = q;
wage = w;
}
public double ratio() {
return (double) wage / quality;
}
@Override
public int compareTo(Worker other) {
return Double.compare(ratio(), other.ratio());
}
}
public double mincostToHireWorkers(int[] quality, int[] wage, int K) {
int N = quality.length;
Worker[] workers = new Worker[N];
for (int i = 0; i < N; i++) {
workers[i] = new Worker(quality[i], wage[i]);
}
Arrays.sort(workers);
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());
int sumOfQuality = 0;
double ans = Double.MAX_VALUE;
for (Worker worker: workers) {
double ratio = worker.ratio();
maxHeap.offer(worker.quality);
sumOfQuality += worker.quality;
if (maxHeap.size() > K) {
sumOfQuality -= maxHeap.poll();
}
if (maxHeap.size() == K) {
ans = Math.min(ans, ratio * sumOfQuality);
}
}
return ans;
}
}
class Solution {
public double mincostToHireWorkers(int[] quality, int[] wage, int K) {
int N = quality.length;
Worker[] workers = new Worker[N];
for (int i = 0; i < N; ++i)
workers[i] = new Worker(quality[i], wage[i]);
Arrays.sort(workers);
double ans = 1e9;
int sumq = 0;
PriorityQueue<Integer> pool = new PriorityQueue();
for (Worker worker: workers) {
pool.offer(-worker.quality);
sumq += worker.quality;
if (pool.size() > K)
sumq += pool.poll();
if (pool.size() == K)
ans = Math.min(ans, sumq * worker.ratio());
}
return ans;
}
}
class Worker implements Comparable<Worker> {
public int quality, wage;
public Worker(int q, int w) {
quality = q;
wage = w;
}
public double ratio() {
return (double) wage / quality;
}
public int compareTo(Worker other) {
return Double.compare(ratio(), other.ratio());
}
}