算法-贪心+优先级队列-IPO

news2024/11/23 0:57:12

算法-贪心+优先级队列-IPO

1 题目概述

1.1 题目出处

https://leetcode.cn/problems/ipo/description/?envType=study-plan-v2&envId=top-interview-150

1.2 题目描述

在这里插入图片描述
在这里插入图片描述

2 回溯法

2.1 思路

2.2 代码

class Solution {
    int result = 0;
    public int findMaximizedCapital(int k, int w, int[] profits, int[] capital) {
        Set<Integer> set = new HashSet<>();
        for (int i = 0; i < profits.length; i++) {
            set.add(i);
        }
        backtrack(k, w, profits, capital, set);
        return result;
    }

    // r 表示还能选的项目数
    // t 表示当前资本总数
    // Set 可选的项目序号

    private void backtrack(int r, int t, int[] profits, int[] capital, Set<Integer> set) {
        // 结束条件
        if (r == 0) {
            result = Math.max(result, t);
            return;
        }
        List<Integer> list = new ArrayList<>(set);
        int select = 0;
        // 路径选择
        for (Integer i : list) {
            // 选择
            if (t >= capital[i]) {
                select++;
                t += profits[i];
                set.remove(i);
                r--;
                // 递归回溯
                backtrack(r, t, profits, capital, set);
                // 撤销选择
                r++;
                t -= profits[i];
                set.add(i);
            }
        }
        if (select == 0) {
            // 一个都没选,也是结束条件
            result = Math.max(result, t);
        }
    }
}

2.3 时间复杂度

直接超时了,选择路径太多了

3 贪心法+优先级队列

2.1 思路

整体思路就是,每次都贪心选择可选项目中利润最大的项目,最后累加得到最大利润。

  1. 把项目按最低成本要求升序排序所有项目
  2. 每次将符合成本要求的项目放入以利润排序的大顶堆
  3. 贪心的取大顶堆堆顶的项目,累加利润到成本后,继续下次判断和选择
  4. 如果可选项目数为0或者大顶堆为空了,代表选择完毕

2.2 代码

class Solution {

    class Node {
        public int index;
        public int profit;
        public int capital;

        public Node(int index, int profit, int capital) {
            this.index = index;
            this.profit = profit;
            this.capital = capital;
        }
    }
    int result = 0;
    public int findMaximizedCapital(int k, int w, int[] profits, int[] capital) {
        // 可选的项目综合信息
        List<Node> projectList = new ArrayList<>();
        for (int i = 0; i < profits.length; i++) {
            projectList.add(new Node(i, profits[i], capital[i]));
        }
        // 把项目按最低成本要求升序排序
        Collections.sort(projectList, (o1, o2) -> o1.capital - o2.capital);
        greed(k, w, projectList, new PriorityQueue<>((o1, o2) -> o2.profit - o1.profit), 0);
        return result;
    }

    // r 表示还能选的项目数
    // t 表示当前资本总数
    // projectList 按最低成本从小到大排序的列表
    // priorityQueue 按项目利润排序的大顶堆
    // i 当前可选择序号
    private void greed(int r, int t, List<Node> projectList, PriorityQueue<Node> priorityQueue, int i) {
        // 结束条件
        if (r == 0) {
            result = Math.max(result, t);
            return;
        }
        // 将符合成本要求的项目放入利润大顶堆
        while (i < projectList.size()) {
            if (t >= projectList.get(i).capital) {
                priorityQueue.add(projectList.get(i));
                i++;
            } else {
                break;
            }
        }
        
        if (priorityQueue.size() == 0) {
            // 一个都不符合要求
            result = Math.max(result, t);
            return;
        }

        // 贪心的选择能选的项目里利润最高的
        Node maxNode = priorityQueue.poll();
        t += maxNode.profit;

        // 继续选下一个项目
        greed(--r, t, projectList, priorityQueue, i);
    }
}

2.3 时间复杂度

在这里插入图片描述

在这里插入图片描述

2.4 空间复杂度

O(n)

  • 构建大顶堆、数组

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1041326.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于ARM+FPGA的ISA总线/MMи总线接口转换设计在轨道交通的应用

总线广泛应用于计算机、工业生产及各种测试设备。ISA总线为IBM公司推出的基于80286CPU的PC&#xff0f;AT微型计算机用扩展总线标准&#xff0c;MMи总线是俄罗斯国内自行设计的专用测试总线&#xff0c;主要用于程控单元模块与MMи总线之间数据及控制信息的交换。在某型导弹测…

竞赛 基于深度学习的视频多目标跟踪实现

文章目录 1 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的视频多目标跟踪实现 …

HBase基础架构及存储原理

一、HBase介绍 HBase是Hadoop生态系统中的一个分布式、面向列的开源数据库&#xff0c;具有高可伸缩性、高性能和强大的数据处理能力。广泛应用于处理大规模数据集。 HBase是一种稀疏的、分布式、持久的多维排序map 稀疏&#xff1a;对比关系型数据库和非关系型数据库&#xf…

ubuntu下网卡插入网线后仍然不连接

网卡驱动已经安装&#xff0c;在settings里可以看到该网卡设备&#xff0c;但是插入网线后仍然不会连接&#xff1a; 鼠标点击也无效。 可尝试&#xff1a; 1. ifconfig找到该网卡&#xff0c;比如我的网卡是 enx0826ae3e81aa 2. sudo ifconfig enx0826ae3e81aa down sud…

OpenCV两张图片实现稀疏点云的生成

1 E矩阵 1.1 由F到E E K T ∗ F ∗ K E K^T * F * K EKT∗F∗K E 矩阵可以直接通过之前算好的 F 矩阵与相机内参 K 矩阵获得 Mat E K.t() * F * K;相机内参获得的方式是一个较为复杂的方式&#xff0c;需要使用棋盘进行定位获得&#xff0c;我们这里直接使用了 OpenMVG 提…

C语言学习(1)—— 环境安装和配置

运行C语言和C程序需要安装MinGW和VSCode。 一. 安装MinGW 1、进入官网下载MinGW&#xff1a;https://sourceforge.net/projects/mingw-w64/files/ 2、解压缩 3、配置环境变量 4、检查是否安装成功 二. 安装VSCode 1、进入官网下载VSCode&#xff1a;https://code.visualstud…

中国制造让苹果跪服,将再增加一家中国高科技供应商

日前产业链人士指出由于京东方的OLED面板有力地制衡韩国面板厂商三星和LGD&#xff0c;促使他们降价&#xff0c;而且技术也不错&#xff0c;因此正计划再引入一家中国OLED面板厂商&#xff0c;以进一步促进OLED面板的竞争。 早期苹果的OLED面板完全由三星供应&#xff0c;由此…

SR800-D 5G工业路由器:将无人驾驶汽车的通信能力提升到极限

​大家好&#xff01;欢迎来到今天星创易联的课堂&#xff0c;我是你们的通信老师&#xff0c;今天我们将讨论无人驾驶解决方案&#xff0c;其中包括SR800-D 5G工业路由器的运用。 首先&#xff0c;让我们聚焦于无人驾驶技术的重要性。无人驾驶汽车正在迅速崛起&#xff0c;这种…

【服务端 | Redis】如何使用redis 有序集合实现股票交易的订单表(价格优先、时间优先)

前两天倒腾redis的有序集合时&#xff0c;自己发现了一个问题&#xff0c;redis的有序集合在score相同的情况 下是如何排序的&#xff1f; 通过谷歌搜索&#xff0c;发现了一些线索&#xff0c;在score相同的情况下&#xff0c;redis使用字典排序&#xff0c;不过不是太明白什…

【红帽】跟着学习如何使用桌面访问命令行

今天我们分享一些红帽Linux的知识&#xff0c;记得关注&#xff0c;会一直更新~ ▶1、以student用户身份并使用student作为密码登录workstation 1.1.在workstation上&#xff0c;从GNOME登录屏幕中单击student用户帐户。系统提示输入密码时&#xff0c;请输入student。 1.2.…

Tuxera NTFS 2022 for Mac破解版百度网盘免费下载安装激活教程

Mac打不开移动硬盘”有多种原因&#xff0c;解决办法也不尽相同。它可能是安装的NTFS for Mac读写软件版本和当前macOS系统的兼容问题、或者是Mac没有正常连接硬盘等等。本篇文章就将为您罗列出导致“Mac打不开移动硬盘”的原因和解决办法。 为此不得不使用著名的Tuxera NTFS …

深入理解传输层协议:TCP与UDP的比较与应用

目录 前言什么是TCP/UDPTCP/UDP应用TCP和UDP的对比总结 前言 传输层是TCP/IP协议栈中的第四层&#xff0c;它为应用程序提供服务&#xff0c;定义了主机应用程序之间端到端的连通性。在本文章&#xff0c;我们将深入探讨传输层协议&#xff0c;特别是TCP和UDP协议的原理和区别…

【PHP手麻系统源码】手术麻醉相关的各项数据的记录、管理和应用

手术室麻醉信息管理系统是定位于手术室和麻醉科的科室级临床信息管理系统&#xff0c;主要用于与手术麻醉相关的各项数据的记录、管理和应用&#xff0c;实现医疗信息的共享及再利用&#xff0c;提高科室的整体信息化水平。   该系统将手术室内的各种设备&#xff08;如呼吸机…

云原生Kubernetes:K8S配置资源管理

目录 一、理论 1.Secret 2.Secret创建 3.Secret使用 4.Configmap 5.Configmap创建 6.Configmap使用 二、实验 1.Secret创建 2.Secret使用 3.Configmap创建 4.Configmap使用 三、问题 1.变量引用生成资源报错 2.查看pod日志失败 3.创建configmap报错 4.YAML创建…

【Redis】Redis做为缓存,MySQL如何与Redis保持数据一致

Redis的作用 一般情况下Redis是用来实现应用和数据库之间的一个读操作的缓存层&#xff0c;主要目的是减少数据库的io&#xff0c;还可以提升数据库io性能 方法一&#xff1a; 先更新MySQL数据库&#xff0c;再删除缓存&#xff0c;再从数据库查询到的最新的数据同步到redis…

二维空间 点绕点旋转公式

记录一下 点绕点旋转公式的推导 点A绕点B逆时针旋转贝塔角度 点A绕点B顺时针旋转贝塔角度 贝塔<阿尔法 点A绕点B顺时针旋转贝塔角度 贝塔>阿尔法

HTML+CSS综合案例一新闻详情

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>新闻详情</title><style>h1{text-align…

【渗透攻防】千变万化的WebShell

前言 WebShell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境&#xff0c;也可以将其称做为一种网页后门。本篇文章将带大家学习如何获取WebShell&#xff0c;如何隐藏WebShell&#xff0c;有攻必有防&#xff0c;最后带大家学习查杀WebShell。 目录 第一节…

服务接口调用OpenFeign_超时机制

超时机制 问题&#xff1a; 服务消费者在调用服务提供者的时候发生了阻塞、等待的情形&#xff0c;这个时候&#xff0c;服务消费者会一直等待下去。在某个峰值时刻&#xff0c;大呈的请求都在同时请求服务消费者&#xff0c;会造成线程的大呈堆积&#xff0c;势必会造成雪崩。…

SpringBoot 学习(六)Shiro

6. Shiro 6.1 简介 6.1.1 什么是Shiro Apache Shiro 是一个 Java 的安全权限框架。Shiro 可以应用在 JavaSE 和 JavaEE 环境中。Shiro 可以完成认证、授权、加密、会话管理、web 集成、缓存等。下载地址&#xff1a;http://shiro.apache.org/ 6.1.2 能力 ​ Authenticat…