最大的团队表现值Java
文章发布较早,内容可能过时,阅读注意甄别。
# 题目
给定两个整数 n 和 k,以及两个长度为 n 的整数数组 speed 和 efficiency。现有 n 名工程师,编号从 1 到 n。其中 speed[i] 和 efficiency[i] 分别代表第 i 位工程师的速度和效率。
从这 n 名工程师中最多选择 k 名不同的工程师,使其组成的团队具有最大的团队表现值。
团队表现值 的定义为:一个团队中「所有工程师速度的和」乘以他们「效率值中的最小值」。
请你返回该团队的最大团队表现值,由于答案可能很大,请你返回结果对 10^9 + 7 取余后的结果。
示例 1:
输入:n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 2
输出:60
解释:
我们选择工程师 2(speed=10 且 efficiency=4)和工程师 5(speed=5 且 efficiency=7)。他们的团队表现值为 performance = (10 + 5) * min(4, 7) = 60 。
示例 2:
输入:n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 3
输出:68
解释:
此示例与第一个示例相同,除了 k = 3 。我们可以选择工程师 1 ,工程师 2 和工程师 5 得到最大的团队表现值。表现值为 performance = (2 + 10 + 5) * min(5, 4, 7) = 68 。
示例 3:
输入:n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 4
输出:72
提示:
- 1 <= k <= n <= 10^5
- speed.length == n
- efficiency.length == n
- 1 <= speed[i] <= 10^5
- 1 <= efficiency[i] <= 10^8
# 思路
Integer[] idx = new Integer[n];
# 解法
class Solution {
static int mod = (int)1e9 + 7;
public int maxPerformance(int n, int[] speed, int[] efficiency, int k) {
Integer[] idx = new Integer[n];
for(int i = 0;i < n;i++) idx[i] = i;
Arrays.sort(idx,(a,b)->efficiency[b] - efficiency[a]);
long res = 0,sum = 0;
PriorityQueue<Integer> q = new PriorityQueue<>();
for(int x = 0;x < n;x++){
int i = idx[x];
q.offer(speed[i]);
sum += speed[i];
if(q.size() > k) sum -= q.poll();
res = Math.max(res,sum * efficiency[i]);
}
return (int)(res % mod);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 总结
- 分析出几种情况,然后分别对各个情况实现