假设 LeetCode 即将开始其 IPO。为了以更高的价格将股票卖给风险投资公司,LeetCode希望在 IPO 之前开展一些项目以增加其资本。 由于资源有限,它只能在 IPO 之前完成最多 k 个不同的项目。帮助 LeetCode 设计完成最多 k 个不同项目后得到最大总资本的方式。 给定若干个项目。对于每个项目 i,它都有一个纯利润 Pi,并且需要最小的资本 Ci 来启动相应的项目。最初,你有 W 资本。当你完成一个项目时,你将获得纯利润,且利润将被添加到你的总资本中。 总而言之,从给定项目中选择最多 k 个不同项目的列表,以最大化最终资本,并输出最终可获得的最多资本。
思路:贪心算法,具体在注释里面。
classSolution:deffindMaximizedCapital(self, k, W, Profits, Capital):"""
:type k: int
:type W: int
:type Profits: List[int]
:type Capital: List[int]
:rtype: int
"""# 这种情况返回全部就好,可以认为一个bugif(k==len(Capital)):return W+sum(Profits)# 标记已经used的项目索引
used=[-1]*k
# 进行k次,每次返回当前所能得到最大利润while k>0:# 一次选择过程中的最大利润
max_profit=0for x inrange(len(Capital)):if W>=Capital[x]and max_profit<Profits[x]and x notin used:
max_profit=Profits[x]
used[k-1]=x
W+=max_profit
k-=1return W
官方给了时间更快的代码
# fasterclassSolution:deffindMaximizedCapital(self, k, W, Profits, Capital):
heap =[]
projects =sorted(zip(Profits, Capital), key=lambda l: l[1])
i =0for _ inrange(k):while i <len(projects)and projects[i][1]<= W:
heapq.heappush(heap,-projects[i][0])
i +=1if heap: W -= heapq.heappop(heap)return W