leetcode 2462. Total Cost to Hire K Workers(雇用 K 名员工的总成本)

news2024/12/22 6:16:58

在这里插入图片描述

每次从 开头candidates个 和 末尾candidates个 工人中选择一个cost最小的。
如果有2个工人cost相同,就选index较小的。
每个工人的cost在数组costs里。
直到雇够k个工人。
问雇k个工人需要多少cost.

思路:

可以考虑用一个优先队列,按cost排序,如果cost相等就按index排序。
刚开始把 前candidates个 和 后candidates个 (index, cost) 放进优先队列.
假设现在左指针指向candidates(边界处), 右指针指向n - candidates(边界处,n为costs长度)。
如果选择的index在前candidates个,就把左边再加进一个(index, cost), 同时左边指针右移一步。
同理右边。

如果总共只有k个工人,那是全部要雇的,
2 * candidates > n - k 时,说明在两边的candidates取完k-1个以后,左右边界重叠,也就是说选cost的时候还是在数组全局选的。
这种情况直接把costs排序,按顺序取k个即可。

class Solution {
    public long totalCost(int[] costs, int k, int candidates) {
        int n = costs.length;
        int left = candidates;
        int right = n - candidates;
        long totalCost = 0;

        if (2*candidates > costs.length-k || costs.length==k) {
            Arrays.sort(costs);
            for (int i=0;i<k;i++) {
                totalCost += costs[i];
            }
            return totalCost;
        }

        PriorityQueue<Worker> minHeap = new PriorityQueue<>((a,b)->(a.cost == b.cost?a.idx-b.idx : a.cost-b.cost));

        if(right < left) right = left; 
        for(int i = 0; i < left; i++) minHeap.add(new Worker(i, costs[i]));
        for(int i = right; i < n; i++) minHeap.add(new Worker(i, costs[i]));
        

        while(k > 0) {
            Worker hired = minHeap.poll();           
            totalCost += hired.cost;
            
            if(left < right) {
                if(hired.idx < left) {
                    minHeap.add(new Worker(left, costs[left]));
                    
                    left ++;
                } else {
                    right --;
                    minHeap.add(new Worker(right, costs[right]));
                   
                }
            }       
            k --;
        }       
        return totalCost;
    }
}


class Worker{
    int idx;
    int cost;
    public Worker(int idx, int cost) {
        this.idx = idx;
        this.cost = cost;
    } 
}

其实也可以不考虑index,
左半边和右半边各用一个优先队列,每次从这2个里面找最小cost,
如果是从左边队列里面选的,下次就给左边队列加入元素,右边同理。
用2个指针指向左右边界。

    public long totalCost(int[] costs, int k, int candidates) {
        int n = costs.length;
        int l = 0;
        int r = n - 1;
        long totalCost = 0;

        if (2*candidates > costs.length-k || costs.length==k) {
            Arrays.sort(costs);
            for (int i=0;i<k;i++) {
                totalCost += costs[i];
            }
            return totalCost;
        }

        PriorityQueue<Integer> left = new PriorityQueue<>();
        PriorityQueue<Integer> right = new PriorityQueue<>();

        
        for(int i = 0; i < candidates; i++) {
            left.add(costs[l++]);
            right.add(costs[r--]);
        }
        
        while(k > 0) {
            if(left.peek() <= right.peek()) {
                totalCost += left.poll();
                left.add(costs[l++]);
            } else {
                totalCost += right.poll();
                right.add(costs[r--]);
            }
            k --;
        }       
        return totalCost;
    }

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

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

相关文章

2023开放原子全球开源峰会——一场开发者的盛宴

文章目录 上午场下午场开发者之夜 #“2023我在开源峰会”特别征文# 2023开放原子全球开源峰会&#xff0c;6月11日-13日在北京盛大召开&#xff0c;开幕第一天正好是周六&#xff0c;没什么事情&#xff0c;一大早就过去了&#xff0c;早晨大概7点出发&#xff0c;公交、地铁一…

Docker Desktop 安装使用教程

一、前言 作为开发人员&#xff0c;在日常开发中&#xff0c;我们需要在本地去启动一些服务&#xff0c;如&#xff1a;redis、MySQL等&#xff0c;就需要去下载这些在本地去启动&#xff0c;操作较为繁琐。此时&#xff0c;我们可以使用Docker Desktop&#xff0c;来搭建我们需…

php+mysql期末作业小项目

目录 1、登录界面 2、注册界面 3、主界面 4、学生表界面 5 、查询学生界面​编辑 6、修改学生信息界面​编辑 7、删除学生信息界面 8、添加学生信息界面 9、后台数据库​编辑 一个简单的php➕mysql项目学生信息管理系统&#xff0c;用于广大学子完成期末作业的参考&…

Android Studio导入flutter项目,运行和调试按钮灰色

描述&#xff1a;用android Studio导入flutter项目&#xff0c;运行和调试按钮无法点击并置灰&#xff0c;显示如下 解决方法&#xff1a;检查是否设置如下内容&#xff1a; 1.是否配置了Android SDK &#xff0c;打开 file > project Structure >project 2.是否配置了F…

【架构】领域驱动设计(DDD)的几种典型架构介绍

文章目录 前言一、专业术语二、架构演变三、限界上下文四、领域驱动设计的四重边界五、整洁分层架构六、六边形架构七、洋葱架构总结 前言 我们生活中都听说了DDD&#xff0c;也了解了DDD&#xff0c;那么怎么将一个新项目从头开始按照DDD的过程进行划分与架构设计呢&#xff…

【Web自动化测试】如何生成高质量的测试报告

运行了所有测试用例&#xff0c;控制台输入的结果&#xff0c;如果很多测试用例那也不能够清晰快速的知道多少用例通过率以及错误情况。 web自动化测试实战之批量执行测试用例场景: 运行 AllTest.py 文件后得到的测试结果不够专业&#xff0c;无法直观的分析测试结果,我们能否…

如何学习和提高CAPL语言编程能力

CAPL是Vector公司开发的&#xff0c;用来配合它的系列产品使用的一款面向过程的语言。CAPL是Communication Access Programming Language的缩写&#xff0c;从字面意思来说&#xff0c;是专门用于通信访问的编程语言。 最初访问CAN总线&#xff0c;现在已扩展到所有的汽车总线…

代理模式(Proxy)

定义 代理是一种结构型设计模式&#xff0c;让你能够提供对象的替代品或其占位符。代理控制着对于原对象的访问&#xff0c;并允许在将请求提交给对象前后进行一些处理。 前言 1. 问题 举个例子&#xff1a;有这样一个消耗大量系统资源的巨型对象&#xff0c; 你只是偶尔需…

mac部署fastadmin踩坑记录

粘贴一下解决配置&#xff0c;主要Nginx配置问题 //后台NGINX location / {if (!-e $request_filename) {rewrite ^(.?\.php)(/.)$ /$1?s$2 last;# 加上这一句配置试试rewrite ^(.*)$ /ewgadmin.php?s$1 last; # 对应项目修改对应入口文件break;}}//接口文档Nginx配置 loca…

sql server还原新数据库,解决原库还原中...

1&#xff09;用studyDB库&#xff0c;备份出数据库备份文件 studyDB_backup_2023_06_19.bak 2&#xff09;用备份文件 studyDB_backup_2023_06_19.bak还原数据新库CollegeStudyDB和原库studyDB到同一服务器 3&#xff09;数据库CollegeStudyDB按原成功&#xff0c;但是原库s…

Linux环境准备以及CentOS7.6系统安装

&#xff08;该图由AI绘制 本人提供教学 FREE&#xff09; 运维概述与Linux系统安装 一、VMware虚拟机 1、什么是虚拟机 其实虚拟机就是在Windows的真机上创建一个独立的其他操作系统的运行环境而且其对宿主机&#xff08;Windows&#xff09;没有任何影响。 2、虚拟机的种…

《操作系统》by李治军 | 实验7 - 地址映射与共享

目录 一、实验目的 二、实验内容 &#xff08;一&#xff09;跟踪地址翻译过程 &#xff08;二&#xff09;基于共享内存的生产者—消费者程序 &#xff08;三&#xff09;共享内存的实现 三、实验准备 1. Linux 中的共享内存 2. 获得空闲物理页面 3. 地址映射 4. 寻…

TS学习笔记——模块

模块 module 模块&#xff1a;在自身的作用域里执行&#xff0c;不是在全局作用域中&#xff0c;若是外部想要使用需要导入导出。 好处&#xff1a;1、提高了代码的复用性 2、解决命名冲突 3、提高代码的可维护性 模块导入导出&#xff1a;export &#xff08;interface…

同步和异步、同步复位、异步复位、同步释放

文章目录 同步和异步同步复位、异步复位、同步释放同步复位异步复位同步释放&#xff08;异步信号和CLK信号存在时序检查、Recover time&Removel time&#xff09;典型的异步复位同步释放的verilog电路设计 同步和异步 数字电路根据逻辑功能的不同特点&#xff0c;可以分成…

如何判断端口有没有被占用

第一步&#xff1a;打开cmd 输入netstat -ano 可以查看自己的所有端口&#xff0c;第一行的本地地址是端口22&#xff0c;最右面对应的pid13260 第二步&#xff1a;打开任务管理器对应的PID就知道那个服务项占用了22端口了 第二种查看指定方法&#xff1a; netstat -ano|finds…

将数据库与LLMs结合,增强模型的长期记忆能力--ChatDB

ChatDB: AUGMENTING LLMS WITH DATABASES AS THEIR SYMBOLIC MEMORY 返回论文和资料目录 论文地址 项目地址 1.导读 清华团队针对大模型LLMs的长期记忆能力进行的改进。改进思路是将LLMs与数据库结合&#xff0c;将信息以符号化的形式存储在数据库中。同时&#xff0c;使用大…

极致呈现系列之:Echarts日历坐标系的时光流转

目录 什么是日历坐标系Echarts日历坐标系的特性Echarts日历坐标系的应用场景Echarts日历坐标系中常用的配置项Vue3中使用Echats日历坐标系实现健康可视化图表日历饼图 什么是日历坐标系 日历坐标系是一种用于展示时间数据的坐标系&#xff0c;将数据按照日期呈现在一个日历形式…

「Java核心技术大会 2023」6月重磅启动,邀你共同探讨Java生态 ~文末福利

Java核心技术大会 2023 大会简介直播预约&#xff1a;视频号“IT阅读排行榜”PART 1 特邀启动专场PART 2 Java语言、平台和趋势专场PART 3 Java应用开发专场PART 4 Java应用与系统架构专场PART 5 Java应用性能优化专场PART 6 大数据与数据库专场PART 7 云原生与Serverless专场P…

STM32学习 6月27日

51单片机中有时钟和时钟树的概念&#xff0c;外设只有GPIO、定时器、和一个串口&#xff0c;使用的都是11.0592MHZ的频率&#xff0c;除了定时器外&#xff0c;其他外设只要上电就可以使用。 stm32每个外设都有对应控制的开关&#xff0c;其所使用的频率各不相同&#xff0c;需…

[Windows] ImageGlass Kobe v8.9便携版

这款ImageGlass Kobe 神仙看图软件&#xff0c;UI漂亮&#xff0c;而且官方收费95元限时免费&#xff0c;打开大图速度极快&#xff0c;界面简洁纯净无广告&#xff0c;简直就是我的梦中情软&#xff0c;看图体验真的嘎嘎好&#xff01;是优秀的 Windows 照片查看器替代品。 具…