当前位置: 首页 > article >正文

leetcode 502.IPO

思路:贪心+优先队列

贪心算法体现在局部最优,对这个题,我们可以这样想:

首先我们需要得到最大资本,有两个因素限制我们:第一个,就是成本问题,成本不够,我们就无法选择好的项目;第二个,就是项目所能收获的利润问题。

这两个因素我们应该优先先考虑成本问题,然后再考虑收益利润问题。

另外,我们看到题目中有提到,最多的k个项目。这应该很明显,我们可以用堆的思想去存储数据。那么,堆中的优先级谁最高呢?当然是成本低并且收获利润高的好了。但这也会导致一个问题,就是当我们选择了成本低利润一般的项目,但是我们有时候成本够了却没有拿到高利润的项目,这样用这样的优先级就不好了。举例:本身你有0资本,(前者的数字是成本,后者为利润)这么几个项目(0,2)(1,2)(2,4)如果照上面说的去做,我们选择了第一个项目之后,就会首先选择第二个项目而不是第三个项目了。这样就导致利润不能最大化。

那么我们怎么办呢?其实倒过来想,我们就让利润收获大的放优先级最高的,先不用考虑成本问题。我们就按照利润收获大的为优先级高的规则入堆,然后我们去取堆中的元素。

当前我们取到的是这几个项目中利润最高的,所以这个时候我们只需要考虑成本了。成本不够,我们就出堆,暂时放到一个队列当中(因为我们后期资本够了反而可以用这个出堆的项目);成本够,我们就用,然后让刚刚已经出堆的项目再回来,我们下一次取的时候再把他们考虑进去就行了。OK,这样就行了,一直到我们取够k个项目为止。

class Solution {
    public int findMaximizedCapital(int k, int w, int[] profits, int[] capital) {
        PriorityQueue<int[]>q=new PriorityQueue<>((a,b)->b[1]-a[1]);
        for(int i=0;i<profits.length;i++){
            q.add(new int[]{capital[i],profits[i]});
        }
        int cnt=0;
        Deque<int[]>pq=new LinkedList<>();
        while(!q.isEmpty()&&cnt<k){
            if(w<q.peek()[0]){
                pq.addLast(q.poll());
            }
            else{
                w+=q.poll()[1];
                while(!pq.isEmpty()){
                    q.add(pq.removeFirst());
                }
                cnt++;
            }
        }
        return w;
    }
}


http://www.kler.cn/a/418191.html

相关文章:

  • 《操作系统 - 清华大学》6 -3:局部页面置换算法:最近最久未使用算法 (LRU, Least Recently Used)
  • 算法训练营day22(二叉树08:二叉搜索树的最近公共祖先,插入,删除)
  • C++练级计划-> 《IO流》iostream fstream sstream详解
  • JUnit介绍:单元测试
  • sentinel使用手册
  • 向日葵连接xrdp虚拟桌面
  • Synaplify之identify_debugger抓信号
  • 使用 Selenium 和 Python 爬取腾讯新闻:从基础到实践
  • SystemUI 下拉框 Build 版本信息去掉
  • LeetCode题练习与总结:找到字符串中所有字母异位词--438
  • 数据库日期时间用什么类型?
  • JMeter实时性能压测可视化系统整合
  • Linq(C#)之对数据分组
  • Springboot小知识(1):启动类与配置
  • Oracle--表空间Tablespace
  • 验证 kubelet 服务已经停止并且不再生成错误日志
  • 达梦数据库常用指令都是工作中常用的
  • 2024金盾信安杯线上赛 MISC ezpng[wp]
  • 【如何提升代码工程质量】code review篇
  • 【机器学习】机器学习学习笔记 - 数据预处理 - 01
  • C++(四)
  • 【系统架构设计师】高分论文:论分布式架构设计及其实现
  • 基于Java Springboot宠物咖微信小程序
  • 指针与字符串简单练习
  • 深入研究:Vue.js 响应式系统的原理与优化
  • ospf协议(动态路由协议)