【面试经典 150 | 堆】IPO

写在前面

本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……

专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:

  • Tag:介绍本题牵涉到的知识点、数据结构;
  • 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
  • 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
  • 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
  • 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。

Tag

【堆】【贪心】【优先队列】


题目来源

502. IPO


解题思路

方法一:贪心+优先队列

思路

使用贪心的思想解决本题,我们应该贪心地保证选择每次投资的项目获取的利润最大。

我们首先将项目按照所需资本从小到大进行排序,每次选择时,假设当前手中持有的资本为 w,我们应该从所有投入资本小于等于 w 的项目中选择利润最大的项目 j,然后此时我们更新手中持有的资本为 w+profits[j]。就这样贪心的选择 k 次即可。

在从所有投入资本小于等于 w 的项目中选择利润最大的项目时,使用大顶堆,将所有能够投资的项目的利润全部压入到堆中,每次从堆中取出最大值,然后更新手中持有的资本,同时将待选的项目利润进入堆,不断重复上述操作。

需要注意的是,本题中的利润是纯利润,指的是已经扣除成本之后获得的利润,所以更新原始资本时直接加上对应的利润即可。

代码

class Solution {
public:
    int findMaximizedCapital(int k, int w, vector<int>& profits, vector<int>& capital) {
        int n = profits.size();
        int idx = 0;
        priority_queue<int, vector<int>, less<int>> pq;
        vector<pair<int, int>> arr;

        for (int i = 0; i < n; ++i) {
            arr.push_back({capital[i], profits[i]});
        }
        sort(arr.begin(), arr.end());
        for (int i = 0; i < k; ++i) {
            while (idx < n && arr[idx].first <= w) {
                pq.push(arr[idx].second);
                ++idx;
            }
            if (!pq.empty()) {
                w += pq.top();
                pq.pop();
            }
            else {
                break;
            }
        }
        return w;
    }
};

复杂度分析

时间复杂度: O ( ( n + k ) l o g ⁡ n ) O((n+k)log⁡n) O((n+k)logn),其中 n n n 是数组 profitscapital 的长度,k 表示最多的选择数目。我们需要 O ( n log ⁡ n ) O(n \log n) O(nlogn) 的时间复杂度来来创建和排序项目,往堆中添加元素的时间不超过 O ( n log ⁡ n ) O(n \log n) O(nlogn),每次从堆中取出最大值并更新资本的时间为 O ( k log ⁡ n ) O(k \log n) O(klogn),因此总的时间复杂度为 O ( n log ⁡ n + n log ⁡ n + k log ⁡ n ) = O ( ( n + k ) log ⁡ n ) O(n \log n + n \log n + k \log n) = O((n + k) \log n) O(nlogn+nlogn+klogn)=O((n+k)logn)

空间复杂度: O ( n ) O(n) O(n)。空间复杂度主要取决于创建用于排序的数组和大根堆。


写在最后

如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。

最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。

# 高校智慧校园解决方案摘要 智慧校园解决方案是针对高校信息化建设的核心工程,旨在通过物联网技术实现数字化校园的智能化升级。该方案通过融合计算机技术、网络通信技术、数据库技术和IC卡识别技术,初步实现了校园一卡通系统,进而通过人脸识别技术实现了更精准的校园安全管理、生活管理、教务管理和资源管理。 方案包括多个管理系统:智慧校园管理平台、一卡通卡务管理系统、一卡通人脸库管理平台、智能人脸识别消费管理系统、疫情防控管理系统、人脸识别无感识别管理系统、会议签到管理系统、人脸识别通道管理系统和图书馆对接管理系统。这些系统共同构成了智慧校园的信息化基础,通过统一数据库和操作平台,实现了数据共享和信息一致性。 智能人脸识别消费管理系统通过人脸识别终端,在无需接触的情况下快速完成消费支付过程,提升了校园服务效率。疫情防控管理系统利用热成像测温技术、视频智能分析等手段,实现了对校园人员体温监测和疫情信息实时上报,提高了校园公共卫生事件的预防和控制能力。 会议签到管理系统和人脸识别通道管理系统均基于人脸识别技术,实现了会议的快速签到和图书馆等场所的高效通行管理。与图书馆对接管理系统实现了一卡通系统与图书馆管理系统的无缝集成,提升了图书借阅的便捷性。 总体而言,该智慧校园解决方案通过集成的信息化管理系统,提升了校园管理的智能化水平,优化了校园生活体验,增强了校园安全,并提高了教学和科研的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wang_nn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值