大根堆+排序
502. IPO
w为手中的资本,profit数组是利润,capital数组为项目对应的成本。
把项目所需要的成本从小到大进行排序。将手中的资本w去投资利润最大的项目profit[i],并且w>capital[i]。
重复操作k次即可。
class Solution {
/**
profits = {1,2,3} //res来源为这个数组
capital = {0,1,1} //判断依据数组
k = 2(可以做两个项目) w =0(起始资金)return 4;(w+profit)不用减去成本。
*/
/**
业务逻辑:在w允许的情况下优先选择 利润最大的,如果项目已经完成,选择次大的
*/
public int findMaximizedCapital(int k, int w, int[] profits, int[] capital) {
int len = profits.length;
// 使用二维数组来存储profit和capital
int[][] pc = new int[len][2];
for(int i =0;i<len;i++){
pc[i][0] = profits[i];
pc[i][1] = capital[i];
}
// 按照利润大小排序
Arrays.sort(pc,(a,b)->a[1]-b[1]);
// 创建大根堆
PriorityQueue<Integer> pq = new PriorityQueue<>((x,y)->y-x);
int pointer =0;
for(int i =0;i<k;i++){
// 维护大根堆,向其中加入启动资金小于w的项目
while(pointer < len&&pc[pointer][1]<=w){
pq.add(pc[pointer][0]);
pointer++;
}
// 如果不为空取出最大值,继续循环整理大根堆,如果可以的项目都做完就结束
if(!pq.isEmpty()){
w+=pq.poll();
}else{
break;
}
}
return w;
}
}