假设 力扣(LeetCode)即将开始 IPO 。为了以更高的价格将股票卖给风险投资公司,力扣 希望在 IPO 之前开展一些项目以增加其资本。 由于资源有限,它只能在 IPO 之前完成最多
k
个不同的项目。帮助 力扣 设计完成最多k
个不同项目后得到最大总资本的方式。给你
n
个项目。对于每个项目i
,它都有一个纯利润profits[i]
,和启动该项目需要的最小资本capital[i]
。最初,你的资本为
w
。当你完成一个项目时,你将获得纯利润,且利润将被添加到你的总资本中。总而言之,从给定项目中选择 最多
k
个不同项目的列表,以 最大化最终资本 ,并输出最终可获得的最多资本。答案保证在 32 位有符号整数范围内。
示例 1:
输入:k = 2, w = 0, profits = [1,2,3], capital = [0,1,1] 输出:4 解释: 由于你的初始资本为 0,你仅可以从 0 号项目开始。 在完成后,你将获得 1 的利润,你的总资本将变为 1。 此时你可以选择开始 1 号或 2 号项目。 由于你最多可以选择两个项目,所以你需要完成 2 号项目以获得最大的资本。 因此,输出最后最大化的资本,为 0 + 1 + 3 = 4。示例 2:
输入:k = 3, w = 0, profits = [1,2,3], capital = [0,1,2] 输出:6提示:
1 <= k <= 105
0 <= w <= 109
n == profits.length
n == capital.length
1 <= n <= 105
0 <= profits[i] <= 104
0 <= capital[i] <= 109
尝试了一下优先队列,2000ms打败5%,勾史,参考一下别人的题解。感觉写的思路都一样,为什么我的慢这么多呢
static bool cmp(vector<int> a, vector<int> b){
return a[1] < b[1];
}
int findMaximizedCapital(int k, int w, vector<int>& profits, vector<int>& capital) {
vector<vector<int>> projects;
priority_queue<int> max_prf;
int pidx = 0, cur_w = w, num = profits.size();
for(int i=0; i<num; i++){
vector<int> temp = {profits[i], capital[i]};
projects.push_back(temp);
}
sort(projects.begin(), projects.end(), cmp);
for(int i=0; i<k; i++){
while(pidx < num && projects[pidx][1] <= cur_w){
max_prf.push(projects[pidx][0]);
pidx++;
}
if(max_prf.size() == 0) break;
cur_w += max_prf.top();
max_prf.pop();
}
return cur_w;
}
参考大佬的代码改了一点,发现自己写比较函数确实耗时会大很多,使用内置比较会快不少,改了之后就打败90%了。
int findMaximizedCapital(int k, int w, vector<int>& profits, vector<int>& capital) {
vector<pair<int, int>> projects;
priority_queue<int> max_prf;
int pidx = 0, cur_w = w, num = profits.size();
for(int i=0; i<num; i++){
pair temp = {capital[i], profits[i]};
projects.push_back(temp);
}
sort(projects.begin(), projects.end());
for(int i=0; i<k; i++){
while(pidx < num && projects[pidx].first <= cur_w){
max_prf.push(projects[pidx].second);
pidx++;
}
if(max_prf.size() == 0) break;
cur_w += max_prf.top();
max_prf.pop();
}
return cur_w;
}