【解题思路】
这道题先用普通的排序方法,每次找出满足起始资本的收益最大的项目区投资,但是有一个测试样例中有亿条数据,超出时间限制。
class Solution {
public int findMaximizedCapital(int k, int w, int[] profits, int[] capital) {
int len = profits.length;
int[][] arr = new int[len][2];
for(int i = 0; i < len; i++)
{
arr[i][0] = profits[i];
arr[i][1] = capital[i];
}
Arrays.sort(arr, new Comparator<int[]>(){
public int compare(int[] a, int[] b){
if(a[1] == b[1]) return b[0]-a[0];
return b[1]-a[1];
}
});
int[] flag = new int[len];
for(int i = 0; i < k; i++)
{
int num = 0;
int cnt = -1;
for(int j = 0; j < len; j++)
{
if(arr[j][1] <= w && flag[j] == 0)
{
if(arr[j][0] > num)
{
num = arr[j][0];
cnt = j;
}
}
}
if(cnt != -1)
{
w += num;
flag[cnt] = 1;
}
}
return w;
}
}
看了题解,原来要用优先队列。
class Solution {
public int findMaximizedCapital(int k, int w, int[] profits, int[] capital) {
int len = profits.length;
int[][] arr = new int[len][2];
for(int i = 0; i < len; i++)
{
arr[i][0] = profits[i];
arr[i][1] = capital[i];
}
Arrays.sort(arr, (a,b)->a[1]-b[1]);
PriorityQueue<Integer> pq = new PriorityQueue<Integer>((a,b)->b-a);
int j = 0;
for(int i = 0; i < k; i++)
{
while(j < len && arr[j][1] <= w)
{
pq.offer(arr[j][0]);
j++;
}
if(!pq.isEmpty())
{
w += pq.poll();
}
}
return w;
}
}