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

文章目录

  • 前言
  • LeetCode、2462. 雇佣 K 位工人的总代价【中等,最小堆+双指针】
    • 题目及类型
    • 思路及代码实现
  • 资料获取

前言

博主介绍:✌目前全网粉丝2W+,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。

涵盖技术内容:Java后端、算法、分布式微服务、中间件、前端、运维、ROS等。

博主所有博客文件目录索引:博客目录索引(持续更新)

视频平台:b站-Coder长路


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

来源:LeetCode专题《LeetCode 75》

题目及类型

题目链接:LeetCode、2462. 雇佣 K 位工人的总代价

类型:数据结构/树/小顶堆


思路及代码实现

思路:双指针+最小堆

首先理解题意,有三个传参:costs、k、candidates。

其中costs中表示有n个工人的代价、k表示我们要选拔k轮,每轮选拔1个人、candidates则是每一轮在costs中的前candidates人与最后candidates人中去挑选一个最小代价,最终我们要找到k个最小代价的和。【注:若是前candidates与后candidates人当中价值相同,那么我们应该取索引最小的】

抽象上来看,每一轮我们应该取得指定candidates*2中的一个最小代价,同时这个最小代价应该是先比较基于值,相同则是索引。有工人的数量是n个,范围为10万,那么就是在每一轮中要取得一个最小代价,想要使用n*logn时间复杂度的,我们借助最小堆来解决。

最小堆中,我们使用一个数组来表示是分别存储的是值、索引、左右,每次移出一个最小元素时,我们可以得知是左边还是右边,最终再设置左右边界值,那么我们就可以每次去根据出堆的元素来判断添加入堆的元素是左边开始还是右边开始的。

代码

复杂度分析:时间复杂度O(nlogn);空间复杂度O(n)

class Solution {public long totalCost(int[] costs, int k, int candidates) {int n = costs.length;//维护一个优先队列 队列数组元素:元素值,索引,左右(左0右1)PriorityQueue<int[]> queue = new PriorityQueue<>(candidates * 2, (o1, o2) -> {//优先比较值,若是值相等比较索引if (o1[0] == o2[0]) {return o1[1] - o2[1];}return o1[0] - o2[0];});//遍历所有的序列(优先将前candidates、后candidates添加)for (int i = 0; i < n; i ++) {if (i < candidates || i >= n - candidates) {queue.offer(new int[]{costs[i], i, i < candidates ? 0 : 1});}}//设置左右端点int left = candidates - 1, right = n - candidates;long sum = 0L;//进行k轮for (int i = 0; i < k; i ++) {//出最小元素int[] numArr = queue.poll();sum += numArr[0];//数组中第一元素是数值//若是当前已经完全将所有元素添加到小顶堆时if (left >= right - 1) continue;//根据左右来进行补充if (numArr[2] == 0) {left ++;queue.offer(new int[]{costs[left], left, 0});}else {right --;queue.offer(new int[]{costs[right], right, 1});}}return sum;}
}

image-20240118233622451


资料获取

大家点赞、收藏、关注、评论啦~

精彩专栏推荐订阅:在下方专栏👇🏻

  • 长路-文章目录汇总(算法、后端Java、前端、运维技术导航):博主所有博客导航索引汇总
  • 开源项目Studio-Vue—校园工作室管理系统(含前后台,SpringBoot+Vue):博主个人独立项目,包含详细部署上线视频,已开源
  • 学习与生活-专栏:可以了解博主的学习历程
  • 算法专栏:算法收录

更多博客与资料可查看👇🏻获取联系方式👇🏻,🍅文末获取开发资源及更多资源博客获取🍅


整理者:长路 整理时间:2024.1.18

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux CentOS stream9 nmcli

nmcli命令是redhat7或者centos7之后的命令&#xff0c;该命令可以完成网卡上所有的配置工作&#xff0c;并且可以写入配置文件&#xff0c;永久生效。 一、前期准备 在讨论、学习与训练nmcli命令前&#xff0c;必须明确几点&#xff1a; 1.开启NetworkManager 使用nmcli命令…

2024.1.19每日一题

LeetCode 2809.使数组和小于等于x的最少时间 2809. 使数组和小于等于 x 的最少时间 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你两个长度相等下标从 0 开始的整数数组 nums1 和 nums2 。每一秒&#xff0c;对于所有下标 0 < i < nums1.length &#xff0c…

C#开源跨平台的多功能Steam工具箱GitHub加速神器

前言 作为一名程序员你是否会经常会遇到GitHub无法访问(如下无法访问图片)&#xff0c;或者是访问和下载源码时十分缓慢就像乌龟爬行一般。今天分享一款C#开源的、跨平台的多功能Steam工具箱和GitHub加速神器&#xff1a;Watt Toolkit。 项目功能 网络加速、账号切换、库存游…

蓝桥杯(C++ 矩形总面积 错误票据 分糖果1 三国游戏 分糖果2)

目录 一、矩形总面积 思路&#xff1a; 代码&#xff1a; 二、错误票据 思路&#xff1a; 代码&#xff1a; 三、分糖果1 思路&#xff1a; 代码&#xff1a; 四、三国游戏 思路&#xff1a; 代码&#xff1a; 五、分糖果2 思路&#xff1a; 代码&#xff1a;…

最长上升子序列模型(LIS)

最长上升子序列模型就像它的名字一样&#xff0c;用来从区间中找出最长上升的子序列。它主要用来处理区间中的挑选问题&#xff0c;可以处理上升序列也可以处理下降序列&#xff0c;原序列本身的顺序并不重要。 模型 895. 最长上升子序列&#xff08;活动 - AcWing&#xff0…

Android中矩阵Matrix实现平移,旋转,缩放和翻转的用法详细介绍

一&#xff0c;矩阵Matrix的数学原理 矩阵的数学原理涉及到矩阵的运算和变换&#xff0c;是高等代数学中的重要概念。在图形变换中&#xff0c;矩阵起到关键作用&#xff0c;通过矩阵的变换可以改变图形的位置、形状和大小。矩阵的运算是数值分析领域的重要问题&#xff0c;对…

2024 前端高频面试题之 HTML/CSS 篇

【前言】随着市场的逐渐恶劣&#xff0c;通过总结面试题的方式来帮助更多的coder&#xff0c;也是记录自己的学习过程&#xff0c;温故而知新。欢迎各位同胞大大点评补充~ 前端面试题之 HTML/CSS 篇 1、HTML 语义化&#xff1f;2、块级元素&内联样式3、盒子模型的理解&…

【并发编程】synchornized原理

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程 ⛺️稳重求进&#xff0c;晒太阳 目录 Monitor概念 Java对象头 普通对象 数组对象 Monitor(锁) Monitor结构如下&#xff1a; 注意&#xff1a; 原理之synchornized 轻量…

在PyCharm中创建Flask项目

在 PyCharm 中创建 Flask 项目的步骤如下&#xff1a; 打开 PyCharm&#xff0c;并选择 "Create New Project"&#xff08;新建项目&#xff09;。在弹出的窗口中&#xff0c;选择左侧的 "Python" 选项&#xff0c;然后选择右侧的 "Flask" 项目…

移动云助力智慧交通数智化升级

智慧交通是在整个交通运输领域充分利用物联网、空间感知、云计算、移动互联网等新一代信息技术&#xff0c;综合运用交通科学、系统方法、人工智能、知识挖掘等理论与工具&#xff0c;以全面感知、深度融合、主动服务、科学决策为目标&#xff0c;推动交通运输更安全、更高效、…

AbstractHttpMessageConverter + easyexcell优雅下载附件

介绍 AbstractHttpMessageConverter 是 Spring 框架中用于处理 HTTP 消息转换的抽象基类。它用于处理来自 HTTP 请求的消息,并将其转换为特定的 Java 对象,或者将 Java 对象转换为 HTTP 响应消息。 这个抽象类允许开发人员创建自定义的 HTTP 消息转换器,以便在 Spring MVC…

HTML 表单

文章目录 表单什么是表单GET和POST两种提交方式有什么不同?表单元素表单项外文本单行文本输入框单行文本密码框单选框复选框下拉列表框上传文件隐藏域填写邮箱填写电话填写数字填写日期进度条多行文本输入框提交按钮取消按钮 用户注册案例 表单 什么是表单 form:表单元素 此…