首页 > 其他分享 >力扣---2462. 雇佣 K 位工人的总代价

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

时间:2023-06-09 15:35:17浏览次数:34  
标签:力扣 right 2462 int --- costs 雇佣 工人 代价

给你一个下标从 0 开始的整数数组 costs ,其中 costs[i] 是雇佣第 i 位工人的代价。

同时给你两个整数 k 和 candidates 。我们想根据以下规则恰好雇佣 k 位工人:

总共进行 k 轮雇佣,且每一轮恰好雇佣一位工人。
在每一轮雇佣中,从最前面 candidates 和最后面 candidates 人中选出代价最小的一位工人,如果有多位代价相同且最小的工人,选择下标更小的一位工人。
比方说,costs = [3,2,7,7,1,2] 且 candidates = 2 ,第一轮雇佣中,我们选择第 4 位工人,因为他的代价最小 [3,2,7,7,1,2] 。
第二轮雇佣,我们选择第 1 位工人,因为他们的代价与第 4 位工人一样都是最小代价,而且下标更小,[3,2,7,7,2] 。注意每一轮雇佣后,剩余工人的下标可能会发生变化。
如果剩余员工数目不足 candidates 人,那么下一轮雇佣他们中代价最小的一人,如果有多位代价相同且最小的工人,选择下标更小的一位工人。
一位工人只能被选择一次。
返回雇佣恰好 k 位工人的总代价。

 

示例 1:

输入:costs = [17,12,10,2,7,2,11,20,8], k = 3, candidates = 4
输出:11
解释:我们总共雇佣 3 位工人。总代价一开始为 0 。
- 第一轮雇佣,我们从 [17,12,10,2,7,2,11,20,8] 中选择。最小代价是 2 ,有两位工人,我们选择下标更小的一位工人,即第 3 位工人。总代价是 0 + 2 = 2 。
- 第二轮雇佣,我们从 [17,12,10,7,2,11,20,8] 中选择。最小代价是 2 ,下标为 4 ,总代价是 2 + 2 = 4 。
- 第三轮雇佣,我们从 [17,12,10,7,11,20,8] 中选择,最小代价是 7 ,下标为 3 ,总代价是 4 + 7 = 11 。注意下标为 3 的工人同时在最前面和最后面 4 位工人中。
总雇佣代价是 11 。
示例 2:

输入:costs = [1,2,4,1], k = 3, candidates = 3
输出:4
解释:我们总共雇佣 3 位工人。总代价一开始为 0 。
- 第一轮雇佣,我们从 [1,2,4,1] 中选择。最小代价为 1 ,有两位工人,我们选择下标更小的一位工人,即第 0 位工人,总代价是 0 + 1 = 1 。注意,下标为 1 和 2 的工人同时在最前面和最后面 3 位工人中。
- 第二轮雇佣,我们从 [2,4,1] 中选择。最小代价为 1 ,下标为 2 ,总代价是 1 + 1 = 2 。
- 第三轮雇佣,少于 3 位工人,我们从剩余工人 [2,4] 中选择。最小代价是 2 ,下标为 0 。总代价为 2 + 2 = 4 。
总雇佣代价是 4 。
 

提示:

1 <= costs.length <= 105
1 <= costs[i] <= 105
1 <= k, candidates <= costs.length

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/total-cost-to-hire-k-workers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


 

先用优先队列从两边开始直接模拟。

保证两个优先队列中的元素数等于 candidates (如果 costs 中的元素数量够的话)。

class Solution {
    public long totalCost (int[] costs, int k, int candidates) {
        PriorityQueue<Integer> priorityQueue1 = new PriorityQueue<>();
        PriorityQueue<Integer> priorityQueue2 = new PriorityQueue<>();
        int len = costs.length;
        int left = 0;
        int right = len - 1;
        for (int i = 0; i < candidates; i++) {
            priorityQueue1.add(costs[left++]);
            if (left > right) {
                break;
            }
            priorityQueue2.add(costs[right--]);
            if (left > right) {
                break;
            }
        }
        long res = 0L;
        for (int i = 0; i < k; i++) {
            if (priorityQueue1.isEmpty()) {
                res += priorityQueue2.poll();
            } else if (priorityQueue2.isEmpty()) {
                res += priorityQueue1.poll();
            } else {
                int tem1 = priorityQueue1.peek();
                int tem2 = priorityQueue2.peek();
                if (tem1 > tem2) {
                    res += priorityQueue2.poll();
                    if (right >= left) {
                        priorityQueue2.add(costs[right--]);
                    }
                } else {
                    res += priorityQueue1.poll();
                    if (right >= left) {
                        priorityQueue1.add(costs[left++]);
                    }
                }
            }
        }
        return res;
    }
}

 优化优化,可以发现:当 candidates * 2 >= len 时,直接对数组进行排序,然后取前 k  个即可。

class Solution {
    public long totalCost (int[] costs, int k, int candidates) {
        Queue<Integer> priorityQueue1 = new PriorityQueue<>();
        Queue<Integer> priorityQueue2 = new PriorityQueue<>();
        int len = costs.length;
        int left = 0;
        int right = len - 1;
        long res = 0L;
        if (len <= candidates * 2) {
            Arrays.sort(costs);
            for (int i = 0; i < k; i++) {
                res += costs[i];
            }
        } else {
            for (int i = 0; i < candidates; i++) {
                priorityQueue1.add(costs[left++]);
                if (left > right) {
                    break;
                }
                priorityQueue2.add(costs[right--]);
                if (left > right) {
                    break;
                }
            }
            for (int i = 0; i < k; i++) {
                if (priorityQueue1.isEmpty()) {
                    res += priorityQueue2.poll();
                } else if (priorityQueue2.isEmpty()) {
                    res += priorityQueue1.poll();
                } else {
                    int tem1 = priorityQueue1.peek();
                    int tem2 = priorityQueue2.peek();
                    if (tem1 > tem2) {
                        res += priorityQueue2.poll();
                        if (right >= left) {
                            priorityQueue2.add(costs[right--]);
                        }
                    } else {
                        res += priorityQueue1.poll();
                        if (right >= left) {
                            priorityQueue1.add(costs[left++]);
                        }
                    }
                }
            }
        }
        return res;
    }
}

 

标签:力扣,right,2462,int,---,costs,雇佣,工人,代价
From: https://www.cnblogs.com/allWu/p/17469332.html

相关文章

  • element的el-radio垂直排列
    element里面的el-radio是水平排列的,在项目里面需要竖直排列的效果,我给每个el-radio都加了块级作用域没生效,最后的解决方法是://单选框:deep(.el-radio){display:block;} ......
  • 011 数据库学习笔记--游标
    游标:定义:游标是对数据查询结果集的一种访问机制,允许用户对结果集进行逐条访问,即单条数据。访问对象是,结果集可以理解为定义在特定结果集上的指针,控制这个指针,遍历数据集或制定特定的行--对其进行读取或写入作用:定位到结果集中的某一行,对当期位置的数据进行读写数据读取......
  • 抗锯齿下采样(Anti-aliasing/down-sampling)-python-numpy 实现
    抗锯齿下采样(Anti-aliasing/down-sampling)-python-numpy实现这篇内容会涉及:卷积和抗锯齿下采样。代码请访问:https://github.com/LonglongaaaGo/ComputerVision问题描述如果直接对图片进行上采样,比如说用nearest线性插值,我们能够发现上采样的图片会有很多锯齿,如上篇从Nearest插值......
  • K-means(K均值聚类算法)算法笔记
    K-means(K均值聚类算法)算法笔记K-means算法,是比较简单的无监督的算法,通过设定好初始的类别k,然后不断循环迭代,将给定的数据自动分为K个类别。事实上,大家都知道K-means是怎么算的,但实际上,它是GMM(高斯混合模型)的一个特例,其而GMM是基于EM算法得来的,所以本文,将对K-means算法的算法思想......
  • AMEYA360:松下小型功率继电器HE-R简介
    继电器是具有隔离功能的自动开关元件,广泛应用于自动控制、机电一体化、电力电子设备。松下全新上市的小型功率继电器HE-R具有小尺寸、高容量、低功耗等优点,适用于充电桩、工业用途!  一、产品特点  二、产品用途  三、详细特点  四、产品种类  五、产品额定文......
  • 17-呼吸灯
    1.呼吸灯呼吸灯在我们的生活中很常见,在手机上多作为消息提醒指示灯而被广泛使用,其效果是小灯在一段时间内从完全熄灭的状态逐渐变到最亮,再在同样的时间段内逐渐达到完全熄灭的状态,并循环往复。这种效果就像“呼吸”一样,有张有弛,而且给人一种很舒服的感觉。其工作原理是利用PWM......
  • Cache - 直接映射缓存
    参考https://zhuanlan.zhihu.com/p/1022934371.Cachelinecachesize:cache可以缓存最大数据的大小。将cache均分相等的块,每一块称为cacheline,现在的硬件设计中,一般cacheline的大小为4-128字节,cacheline做的太小会导致tag资源占用过大。cacheline是cache和主存......
  • SC-FEGAN: Face Editing Generative Adversarial Network with User’s Sketch and Co
    SC-FEGAN:FaceEditingGenerativeAdversarialNetworkwithUser’sSketchandColorhttps://github.com/run-youngjoo/SC-FEGANhttps://arxiv.org/abs/1902.06838基于GAN的人脸编辑,效果非常好,应用点非常新颖。总的来说,效果非常好,包括很多细节都能够进行编辑。就创新点来讲,就是......
  • 强化学习On-policy vs Off-policy
    强化学习On-policyvsOff-policy这里我们讲讲强化学习中on-policy和off-policy的区别。实际上这个区别非常简单,就是说如果算法在更新它的policy的时候,它是依赖于前面的Qvaluefunction的话,那么它就是on-policy的。反之如果它是依赖于随机的一个输入或者人为的操控,那么它就是一个......
  • 卷积神经网络-全面图解-带你了解前向后向传播的所有细节(文末代码)
    卷积神经网络-全面图解-带你了解前向后向传播的所有细节综述本文将会从基础的前馈神经网络入手,通过bp神经网络,引出卷积神经网络,并把专门的重点放在如何理解和实现卷积神经网络的卷积层、下采样层、全连接层、以及最终的softmax的反向传播的理解。最后实现基于python的车标识别6分类......