欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > 【数据结构-堆】【hard】力扣502. IPO

【数据结构-堆】【hard】力扣502. IPO

2025/4/13 5:36:17 来源:https://blog.csdn.net/sjsjs11/article/details/145217920  浏览:    关键词:【数据结构-堆】【hard】力扣502. IPO

假设 力扣(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

在这里插入图片描述
优先队列

class Solution {
public:int findMaximizedCapital(int k, int w, vector<int>& profits, vector<int>& capital) {int n = profits.size();priority_queue<int> p;vector<pair<int, int>> projects;for (int i = 0; i < n; ++i) {projects.push_back({capital[i], profits[i]});}sort(projects.begin(), projects.end());int i = 0;for(int j = 0; j < k; j++){while(i < n && w >= projects[i].first){p.push(projects[i].second);i++;}if (!p.empty()) {w += p.top();  p.pop();        }}return w;}
};

这道题我们可以用贪心的思想,当我们有w资本的时候,能完成某些项目的投资,那么由于我们投资的次数有限制,并且投资利润高的项目能使w更大以便能有投资更多项目的权限。那么我们在能投资的项目中,就选择利润最高的进行投资。

我们定义一个projects来对项目的要求资本进行排序,这样以便我们可以知道当我们有w资本的时候,可以投资哪些项目。接下来我们进行k次投资遍历,我们知道投资的项目后推入大根堆q中,堆顶就是我们所需要的能投资的最大利润项目,然后进行投资,利润加到w中。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词