解题思路:将capital数组和profits数组融合成为一个结构体Node,先按照capital进行从小到大排序,如果capital大小一致则按照profits从大到小进行排序。创建一个大顶堆,按照profits进行排序,通过一个while循环不停将Node加入到大顶堆中去,每次取最大的元素进行相加,最后得到结果。
代码:
class Solution {
private class Node{
int x;
int y;
public Node(int x, int y){
this.x = x;
this.y = y;
}
}
public int findMaximizedCapital(int k, int w, int[] profits, int[] capital) {
int len = profits.length;
Node[] pc = new Node[len];
for(int i=0;i<len;i++){
pc[i] = new Node(profits[i], capital[i]);
}
//按照capital从小到大排序,相等则按照profits从大到小排序
Arrays.sort(pc, (o1, o2) -> o1.y == o2.y ? o2.x - o1.x : o1.y - o2.y);
//堆q按照profits从大到小排序
PriorityQueue<Node> q = new PriorityQueue<>((o1, o2) -> o2.x - o1.x);
int kk = 0;
int idx = 0;
while(kk < k){
//大顶堆的堆顶元素或许都在不停的变换
while(idx < len && pc[idx].y <= w){
q.add(pc[idx++]);
}
if(q.isEmpty()){
break;
}
kk++;
w += q.poll().x;
}
return w;
}
}