Leetcode2462. 雇佣 K 位工人的总代价

【C++堆(优先队列)】2462. 雇佣 K 位工人的总代价|1763 给你一个下标从 0 开始的整数数组 costs ,其中 costs[i] 是雇佣第 i 位工人的代价。 同时给你两个整数 k 和 candidates 。我们想根据以下规则恰好雇佣 k 位工人: 总共进行 k 轮雇佣,且每一轮恰好雇佣一位工人。 在每一轮雇佣中,从最前面 candidates 和最后面 candidates 人中选出代价最小的一位工人,如果有多位代价相同且最小的工人,选择下标更小的一位工人。 比方说,costs = [3,2,7,7,1,2] 且 candidates = 2 ,第一轮雇佣中 阅读详情

Every day a Leetcode

题目来源:2462. 雇佣 K 位工人的总代价

解法1:小根堆

雇佣过程可以用两个最小堆来模拟,一个负责维护 costs 剩余数字的最前面 candidates 个数的最小值,另一个负责维护 costs 剩余数字的最后面 candidates 个数的最小值。

具体算法如下:

  1. 设 cost 的长度为 n。如果 2*candidates+k>n,我们一定可以选到 cost 中最小的 k 个数,所以直接将 cost 从小到大排序,返回 cost 的前 k 个数之和。
  2. 初始化答案 ans=0。初始化最小堆 pre 为 costs 最前面的 candidates 个数,初始化最小堆 suf 为 costs 最后面的 candidates 个数。初始化下标 i=candidates,j=n−1−candidates。
  3. 循环 k 次。每次循环,如果 pre 的堆顶小于等于 suf 的堆顶,则弹出 pre 的堆顶,加入答案,然后把 costs[i] 加入 pre,i 自增 1;否则,弹出 suf 的堆顶,加入答案,然后把 costs[j] 加入 suf,j 自减 1。
  4. 返回答案。

代码:

/*
 * @lc app=leetcode.cn id=2462 lang=cpp
 *
 * [2462] 雇佣 K 位工人的总代价
 */

// @lc code=start
class Solution
{
public:
    long long totalCost(vector<int> &costs, int k, int candidates)
    {
        int n = costs.size();
        if (2 * candidates + k > n)
        {
            ranges::sort(costs);
            return accumulate(costs.begin(), costs.begin() + k, 0LL);
        }
        priority_queue<int, vector<int>, greater<>> pre, suf;
        for (int i = 0; i < candidates; i++)
        {
            pre.push(costs[i]);
            suf.push(costs[n - 1 - i]);
        }

        long long ans = 0LL;
        int i = candidates, j = n - 1 - candidates;
        while (k--)
        {
            // 如果有多位代价相同且最小的工人,选择下标更小的一位工人
            if (pre.top() <= suf.top())
            {
                ans += pre.top();
                pre.pop();
                pre.push(costs[i]);
                i++;
            }
            else
            {
                ans += suf.top();
                suf.pop();
                suf.push(costs[j]);
                j--;
            }
        }
        return ans;
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O((c+k)log(c+k)),其中 c 是数组 candidate 的元素个数。

空间复杂度:O(c),其中 c 是数组 candidate 的元素个数。

【华为OD技术面试手撕真题】3、小行星碰撞 | 手撕真题+思路参考+代码解析(C & C++ & Java & Python & JS) 小行星碰撞,本专栏更新每年华为OD机试的高频手撕代码题,每个题目都会使用五种语言进行解答(C & C++& Java & Python & JS),思路分析都非常详细, 实现最低的时间复杂度和高通过率,每个解题思路超过百字,内含各个编程语言的八股文面试题,欢迎大家订阅学习, 代码可以直接运行使用,全网限时最低价,持续更新 阅读详情

相关推荐

xHCI驱动学习(1) 核心数据结构

虽然Linux内核拥有C语言构建的身体,但它骨子里散发的是面向对象的气质,这一个个的对象就是struct。面对一个内核模块的时候,首先要找出关键的struct和它们之间的关系,才能摸清代码的骨骼脉络。今天来理清USB xHCI相关的数据结构类型usb_hcd、xhci_hcd、hc_driver和全局变量xhci_pci_driver、xhci_hc_driver、xhci_pci_hc_driver之间的关系。

1万+

【LeetCode每日一题】2462. 雇佣 K 位工人的总代价

给你一个下标从 0 开始的整数数组 costs ,其中 costs[i] 是雇佣第 i 位工人的代价。 同时给你两个整数 k 和 candidates 。我们想根据以下规则恰好雇佣 k 位工人

OkizukiNanami的博客 269

静态时序分析(STA)_深入解析Data to Data Checks的零周期挑战

本文深入解析了静态时序分析(STA)中Data to Data Checks的核心概念与零周期挑战。重点探讨了当Setup要求值超过时钟周期时,工具如何调整发射沿,并导致Hold检查的发射与捕获沿“分裂”这一反直觉现象。文章通过案例详细解读了时序报告,并提供了通过调整约束或接受多周期保持两种策略来应对这一挑战,帮助工程师正确理解和处理此类复杂时序检查。

weixin_29204205的博客 350

LeetCode、2462. 雇佣 K 位工人的总代价【中等,最小堆+双指针】

其中costs中表示有n个工人的代价、k表示我们要选拔k轮,每轮选拔1个人、candidates则是每一轮在costs中的前candidates人与最后candidates人中去挑选一个最小代价,最终我们要找到k个最小代价的和。最小堆中,我们使用一个数组来表示是分别存储的是值、索引、左右,每次移出一个最小元素时,我们可以得知是左边还是右边,最终再设置左右边界值,那么我们就可以每次去根据出堆的元素来判断添加入堆的元素是左边开始还是右边开始的。首先理解题意,有三个传参:costs、k、candidates。

每个人都是独一无二的,把握好自己的节奏,跟着自己的心走。 619

【遥感数字图像处理(朱文泉)】第一章 数字图像基础

关于图像的定义、类型、模拟图像和数字图像

甜子yu的博客 4404

到底什么是电源的斜波补偿,电源芯片CS引脚作用,一文讲清楚!

上文有提到电流环,其实电流环再细分也有很多模式,用的最多的是峰值电流模式峰值电流模式调节工作原理如下:(1)当输出负载增大时,输出电压降低,因此,Vc 增大,线性增加的电感电流只有升高到更大的值才能使 PWM 电流比较器翻转,开关管导通的时间增长,占空比增加,输入功率增加,因此输出电压增加,当输出电压增加到调节的范围内时,系统保持平衡。

jwgdhuwdhg的博客 1万+

LeetCode 第318场周赛

LeetCode

一个小孩 255

在Keil uv5里面添加STC元器件库,不影响其他元件

先到网上下载stc.CBD(宏晶网站的地址实效了)还有STC新系列单片机的头文件,宏晶的网站就有1、在Keil/C51/INC下新建目录"STC"文件夹, 把所有STC新系列单片机的头文件拷贝到"STC"目录下。2、下载的用于keil下的STC器件数据库更名为STC.CDB并拷贝到Keil/UV4目录下。3、打开Keil文件夹下的TOOLS.ini文件。4、在[UV2]下键入CDB0="UV2\S

技术联盟 1万+

LeetCode2462题(个人解法以及官方解法详解)

最小代价为 1 ,有两位工人,我们选择下标更小的一位工人,即第 0 位工人,总代价是 0 + 1 = 1。注意,下标为 1 和 2 的工人同时在最前面和最后面 3 位工人中。] 中选择,最小代价是 7 ,下标为 3 ,总代价是 4 + 7 = 11。最小代价是 2 ,有两位工人,我们选择下标更小的一位工人,即第 3 位工人。最小代价是 2 ,下标为 4 ,总代价是 2 + 2 = 4。最小代价为 1 ,下标为 2 ,总代价是 1 + 1 = 2。- 第三轮雇佣,少于 3 位工人,我们从剩余工人 [

qq_56977904的博客 1369

KRC文件——编程中的重要文件

KRC文件是指KUKA机器人控制器(KUKA Robot Controller)所使用的文件格式。KUKA是一家知名的机器人制造商,其机器人控制器通过KRC文件来管理和执行机器人程序。KRC文件包含了机器人的运动指令、逻辑控制、传感器数据等信息,以及与机器人相关的配置参数。这些文件通常使用KRL(KUKA Robot Language)编写,是一种特定的编程语言。KRC文件具有扩展名为.krc的格式,可以在KUKA机器人控制器上直接加载和执行。

TechProX的博客 2971

【002】C++ 语言核心:关键字深度解析与分类指南

auto:自动类型推导bool:布尔类型break:跳出循环或switch语句case:switch语句分支char:字符类型class:定义类const:常量continue:结束当前循环,开始下一次循环default:switch语句默认分支delete:删除对象do:do-while循环double:双精度浮点数类型else:if语句的否定分支enum:枚举类型explicit:显式构造函数export:导出符号extern:声明外部变量或函数。

Lion_Long的博客 1249

LeetCode——Weekly Contest 318

LeetCode周赛第318场记录

zheyuan的博客 567

5、癌症数据预处理技术与深度学习在癌症预测中的应用

本文详细介绍了癌症数据预处理技术和深度学习在癌症预测中的应用。针对CT扫描图像、X射线图像、超声图像、基因表达数据和文本数据等不同类型的癌症数据,分别阐述了去噪、插值、配准、归一化等预处理技术的具体方法。同时,分析了深度学习在乳腺癌、白血病和宫颈癌预测中的作用,结合相关影响因素探讨了模型的应用潜力。此外,还总结了深度学习在癌症预测中面临的挑战及未来发展方向,为癌症的早期诊断与精准预测提供了理论支持和技术参考。

alice7model的博客 123

力扣2462.雇佣K位工人的总代价

【代码】力扣2462.雇佣K位工人的总代价。

Pisasama的博客 305

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【LeetCode:2462. 雇佣 K 位工人的总代价 + 最小堆】

【LeetCode:2462. 雇佣 K 位工人的总代价 + 最小堆】给你一个下标从 0 开始的整数数组 costs ,其中 costs[i] 是雇佣第 i 位工人的代价。 同时给你两个整数 k 和 candidates 。我们想根据以下规则恰好雇佣 k 位工人: 总共进行 k 轮雇佣,且每一轮恰好雇佣一位工人。 在每一轮雇佣中,从最前面 candidates 和最后面 candidates 人中选出代价最小的一位工人,如果有多位代价相同且最小的工人,选择下标更小的一位工人。 比方说,costs = [

Coder_ljw的博客 1164

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

LeetCode 2462. 雇佣 K 位工人的总代价【最小堆,模拟】

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。。

memcpy0的博客 1223

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

LeetCode2462. 雇佣 K 位工人的总代价

否则创建两个升序的优先级队列q1和q2,分别代表前后两个窗口,每次比较q1和q2队首元素取较小值,如果从q1取出,则从自由数最左端取元素补充到q1,如果从q2取出,则从自由数最右端取元素补充到q2。,costs.size()-2*candidates表示初始状态两个窗口没有覆盖的自由数个数,每从窗口查询一次后将一个自由数放进两个窗口之一,查询次数大于自由数的个数时,所有的自由数就都能参与比较了。注意不能是等于,等于只能保证所有自由数进入窗口,但是最后一个自由数并不参与比较,如果它是最小值还是不会被选到。

under_heart的博客 332

【数据结构-堆】力扣2462. 雇佣 K 位工人的总代价

当我们从小根堆中找到最小代价的时候,我们可以通过索引去找到他是在左边的区间还是右边的区间,然后找到对应的区间后,我们就移动其区间的指针,使最前面区间和最后面区间的范围都是candidates。比方说,costs = [3,2,7,7,1,2] 且 candidates = 2 ,第一轮雇佣中,我们选择第 4 位工人,因为他的代价最小 [3,2,7,7,1,2]。第二轮雇佣,我们选择第 1 位工人,因为他们的代价与第 4 位工人一样都是最小代价,而且下标更小,[3,2,7,7,2]。

sjsjs11的博客 712

Leetcode—2462. 雇佣 K 位工人的总代价【中等】

运行结果 之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

Atticus的博客 302

LeetCode2462雇佣 K 位工人的总代价

给你一个下标从 0 开始的整数数组 costs ,其中 costs[i] 是雇佣第 i 位工人的代价。同时给你两个整数 k 和 candidates。我们想根据以下规则恰好雇佣 k 位工人:总共进行 k 轮雇佣,且每一轮恰好雇佣一位工人。在每一轮雇佣中,从最前面 candidates 和最后面 candidates 人中选出代价最小的一位工人,如果有多位代价相同且最小的工人,选择下标更小的一位工人。

JELEE 290

LeetCode:2462. 雇佣 K 位工人的总代价(最小堆 Java)

两个堆中在剩余数量小于candidates的时候没必要两个堆都存相同的一个数据,因为最后都是要判断两个堆的最小值的最小值,所以用双指针注意判断一下边界即可,当边界未触碰时,正常的向堆放入放出数据。

Cosmoshhhyyy的博客 988

LeetCode 2462题: 雇佣 K 位工人的总代价块(原创)

这道题的解题思路关键点就是采用最小堆,快速获取若干个数中最小值:这道题的解题思路不是很难,但几个边界条件比较麻烦

it_fly的专栏 946

初学python记录:力扣2462. 雇佣 K 位工人的总代价

给你一个下标从开始的整数数组costs,其中costs[i]是雇佣第i位工人的代价。同时给你两个整数k和candidates。我们想根据以下规则恰好雇佣kkcandidatescandidates414candidates返回雇佣恰好k位工人的总代价。

Demo0219的博客 158

LeetCode 2462. 雇佣 K 位工人的总代价 (优先队列、小顶堆)

【代码】LeetCode 2462. 雇佣 K 位工人的总代价 (优先队列、小顶堆)

记录一些刷过的题并分享学习心得 80

2462. 雇佣 K 位工人的总代价 -- LeetCode每日一题

2462. 雇佣 K 位工人的总代价 -- LeetCode每日一题

ros275229的博客 280

面试必考精华版Leetcode2462. 雇佣 K 位工人的总代价

【代码】面试必考精华版Leetcode2462. 雇佣 K 位工人的总代价。

meeiuliuus的博客 77
上一篇: VTK 的可视化方法:颜色映射
下一篇: H.265 与 H.264 的主要区别
UestcXiye
博客等级 码龄8年 9029粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

UestcXiye

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

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

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

打赏作者

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

抵扣说明:

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

余额充值