题目链接
IPO
题目描述


注意点
- profits是纯利润
- 由于资源有限,只能在 IPO 之前完成最多 k 个不同的项目
- 只有具有足够的资本时才能启动某个项目
解答思路
- 因为要最多只能完成k个不同的项目,挑选项目时需要找尽可能利润更高的项目,所以要将利润从大到小进行排序。同时,利润大的项目可能因为最初资本不够无法购买,还需要将成本从小到大进行排序,关键就是如何对利润和成本进行排序的同时还能保证他们之间的关系可以对的上
- 从完成第一个项目开始,后续每个项目都一定能获取利润,所以最初能购买的项目到了后续也一定能购买,且购买过的项目无法再继续购买,所以对成本按照从低到高进行排序后,在进入新的一次购买时,将其现在所能购买的项目都添加到队列中
- 每次购买时只需要从能购买的项目中找到利润最大的一个,所以考虑使用优先队列存储,保证堆顶是利润的最大值,在购买该项目后,更新资产值,同时将该项目从优先队列的顶部移除
代码
class Solution {
public int findMaximizedCapital(int k, int w, int[] profits, int[] capital) {
int n = profits.length;
int[][] arr = new int[n][2];
for (int i = 0; i < n; i++) {
arr[i][0] = capital[i];
arr[i][1] = profits[i];
}
Arrays.sort(arr, (x, y) -> (x[0] - y[0]));
PriorityQueue<Integer> pq = new PriorityQueue<>((x, y) -> (y - x));
int curr = 0;
for (int i = 0; i < k; i++) {
while (curr < n && arr[curr][0] <= w) {
pq.add(arr[curr][1]);
curr++;
}
if (pq.isEmpty()) {
break;
}
w += pq.poll();
}
return w;
}
}
关键点
- 使用二维数组存储成本和利润的关系
- 按照成本从低到高进行排序,方便找到当前资产可以购买的项目
- 将可购买的项目按照利润从高到低放入优先队列中,每次取队顶的元素保证获取最大利润