华为23年9月笔试原题,巨详细题解,附有LeetCode测试链接

请添加图片描述

文章目录

  • 前言
  • 思路
  • 主要思路
  • 关于f函数的剖析
  • Code
    • 就到这,铁子们下期见!!!!

前言

铁子们好啊!今天阿辉又给大家来更新新一道好题,下面链接是23年9月27的华为笔试原题,LeetCode上面的hard难题,阿辉带大伙来拿下它!!!
你可以安排的最多任务数目

思路

二分和单调队列以及一丢丢贪心

主要思路

  • 先按照任务难度和工人能力排序

  • 二分的范围是[l,r)左闭右开,l = 0,r = n+1,最多完成n个任务,n取任务数与工人数的较小值,因为左闭右开,所以rn+1,最少完成0个任务,所以l0

  • 然后就是如何判断lr的中点m是否是能够完成的任务数

    • 排序的重要就在这里体现了,我们取任务难度最小的m个与能力最强的m个工人如果能够完成,那就能完成,如果不能就完成不了

主逻辑代码:

// 主函数,用于找出可以分配的最大任务数量。int maxTaskAssign(vector<int>& tasks, vector<int>& workers, int pills, int strength) {int n = min(tasks.size(), workers.size()); // 取任务数和工人数中较小的一个,因为任务数不能超过工人数。int l = 0; // 二分查找的左边界int r = n+1; // 二分查找的右边界sort(tasks.begin(), tasks.end()); // 将任务按难度排序sort(workers.begin(), workers.end()); // 将工人按能力排序// 二分查找,确定最大可分配任务数while (l < r) {int m = l + (r - l) / 2; // 中间点//f函数用于判断是否可以完成m个任务if (f(tasks, workers, pills, strength, m)) {l = m + 1; // 如果能完成m个任务,则尝试增加任务数} else {r = m; // 如果不能完成m个任务,则减少任务数}}return l - 1; // 返回最终的任务数(因为在二分查找结束时,l指向的是第一个不能完成的任务数)}

关于f函数的剖析

f函数的空间复杂度是 O ( M ) O(M) O(M),因为ij都只前进不回退,也就是只遍历2m长度的数组
N为任务数组与工人数组的较大值
然后主函数排序两个数组是 O ( N l o g N ) O(NlogN) O(NlogN),二分加上f函数最多也不超过 O ( N l o g N ) O(NlogN) O(NlogN)
所以时间复杂度 O ( N l o g N ) O(NlogN) O(NlogN)
空间复杂度低于 O ( N ) O(N) O(N),队列长度取决于完成任务的数量

    int deque[50001]; // 一个双端队列,用于存储可能通过使用或不使用药丸完成的任务。// 辅助函数,用于判断是否能在当前条件下完成m个任务。bool f(vector<int>& ts, vector<int>& ws, int p, int s, int m) {int h = 0, t = 0; // 双端队列的头部和尾部指针//i指向最容易完成的第一个任务,j指向能力第m强的工人//遍历m个最容易完成的任务以及能力最强的m个工人for (int i = 0, j = ws.size() - m; j < ws.size(); ++j) {// 遍历每一个工人,并尝试分配任务while (i < m && ts[i] <= ws[j]) {// 如果当前任务可以由工人直接完成,则将其加入队列deque[t++] = ts[i++];}//经过上面的if如果队列里面没东西,说明该试试药了//如果队列里面有东西,可能是前一个工人嗑药留下的if (h == t || ws[j] < deque[h]) {// 如果队列为空,或当前工人无法完成队列头部的任务,则尝试使用药丸--p; // 使用一颗药丸while (i < m && ts[i] <= ws[j] + s) {// 将可以通过使用药丸完成的任务加入队列deque[t++] = ts[i++];}if (h == t || p < 0 || ws[j] + s < deque[h]) {// 如果队列依然为空,或药丸用完,或即使使用药丸也无法完成队列头部的任务,则返回falsereturn false;}--t; // 上面没返回说明嗑药有用,完成最难的任务,一点子贪心各位肯定能懂,队列尾部指针前移} else {//否则++h; // 工人直接完成了队列头部的任务,队列头部指针后移}}//能走到这就说明能完成return true; 

Code

class Solution {
public:// 主函数,用于找出可以分配的最大任务数量。int maxTaskAssign(vector<int>& tasks, vector<int>& workers, int pills, int strength) {int n = min(tasks.size(), workers.size()); // 取任务数和工人数中较小的一个,因为任务数不能超过工人数。int l = 0; // 二分查找的左边界int r = n+1; // 二分查找的右边界sort(tasks.begin(), tasks.end()); // 将任务按难度排序sort(workers.begin(), workers.end()); // 将工人按能力排序// 二分查找,确定最大可分配任务数while (l < r) {int m = l + (r - l) / 2; // 中间点if (f(tasks, workers, pills, strength, m)) {l = m + 1; // 如果能完成m个任务,则尝试增加任务数} else {r = m; // 如果不能完成m个任务,则减少任务数}}return l - 1; // 返回最终的任务数(因为在二分查找结束时,l指向的是第一个不能完成的任务数)}int deque[50001]; // 一个双端队列,用于存储可能通过使用或不使用药丸完成的任务。// 辅助函数,用于判断是否能在当前条件下完成m个任务。bool f(vector<int>& ts, vector<int>& ws, int p, int s, int m) {int h = 0, t = 0; // 双端队列的头部和尾部指针for (int i = 0, j = ws.size() - m; j < ws.size(); ++j) {// 遍历每一个工人,并尝试分配任务while (i < m && ts[i] <= ws[j]) {// 如果当前任务可以由工人直接完成,则将其加入队列deque[t++] = ts[i++];}if (h == t || ws[j] < deque[h]) {// 如果队列为空,或当前工人无法完成队列头部的任务,则尝试使用药丸--p; // 使用一颗药丸while (i < m && ts[i] <= ws[j] + s) {// 将可以通过使用药丸完成的任务加入队列deque[t++] = ts[i++];}if (h == t || p < 0 || ws[j] + s < deque[h]) {// 如果队列依然为空,或药丸用完,或即使使用药丸也无法完成队列头部的任务,则返回falsereturn false;}--t; // 完成一个任务,队列尾部指针前移} else {++h; // 工人直接完成了队列头部的任务,队列头部指针后移}}return true; // 如果所有工人都成功分配了任务,则返回true}
};

就到这,铁子们下期见!!!!

请添加图片描述

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

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

相关文章

开源≠不赚钱,开源软件盈利的7大模式。

开源不是目的&#xff0c;目的是圈用户&#xff0c;留住用户&#xff0c;盈利自然不成问题。 开源系统可以通过多种方式赚钱&#xff0c;以下是其中几种常见的方式&#xff1a; 提供付费支持&#xff1a; 开源系统可以提供付费的技术支持服务&#xff0c;包括安装、配置、维…

mysql5.6安装---windows版本

安装包下载 链接&#xff1a;https://pan.baidu.com/s/1L4ONMw-40HhAeWrE6kluXQ 提取码&#xff1a;977q 安装视频 1.解压完成之后将其放到你喜欢的地址当中去&#xff0c;这里我默认放在了D盘&#xff0c;这是我的根目录 2.配置环境变量 我的电脑->属性->高级->环境…

阿里云增加数据库访问白名单

阿里云增加数据库访问白名单 概况 我们希望在外网访问数据库时&#xff0c;可能会遇到无法连接的问题&#xff0c;这有可能是被拦截了。这时就需要去查看自己的ip有没有在白名单里面&#xff0c;没有的话就把ip加入到白名单。 路径 阿里云控制台-搜索RDS-进入RDS管理控制台…

宋小黑的生财知识资料库第1011期

大家好&#xff0c;我是小黑&#xff0c;在当前经济和职场环境中&#xff0c;拥有一份副业已经成为很多人增加财务安全感和提升个人能力的重要手段。通过投身于副业&#xff0c;你不仅可以为自己创造一个额外的收入来源&#xff0c;减少对主职工作的经济依赖&#xff0c;还可以…

【C++】类和对象(四)

前言&#xff1a;在类和对象中&#xff0c;我们走过了十分漫长的道路&#xff0c;今天我们将进一步学习类和对象&#xff0c;类和对象这块荆棘地很长&#xff0c;各位一起加油呀。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:高质量&a…

【Spring】定义过滤器Filter和拦截器Interceptor

# 定义过滤器 package com.holen.filter;import jakarta.servlet.Filter; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; import java.io.IOException;pub…

【Web】NSSCTF Round#18 Basic个人wp(部分)

目录 ①门酱想玩什么呢&#xff1f; ②Becomeroot ①门酱想玩什么呢&#xff1f; 先试一下随便给个链接 不能访问远程链接&#xff0c;结合评论区功能&#xff0c;不难联想到xss&#xff0c;只要给个评论区链接让门酱访问就可 我们研究下评论区 从评论区知道&#xff0c;要…

jmeter-问题三:如何在给接口命名,使得察看结果树更清晰

问题三&#xff1a;如何在给接口命名&#xff0c;使得察看结果树更清晰 jmeter中声明的变量在任意地方都可以引用&#xff0c;我们可以利用这一点来实现 解决方法&#xff1a; 场景&#xff1a;测试登录接口&#xff08;包含登录成功&#xff0c;密码错误&#xff0c;用户名…

Android---Jetpack Compose学习004

CompositionLocal 通常情况下&#xff0c;在 Compose 中&#xff0c;数据以参数形式向下流经整个界面树传递给每个可组合函数。但是&#xff0c;对于广泛使用的常用数据&#xff08;如颜色或类型样式&#xff09;&#xff0c;这可能会很麻烦。 为了支持无需将颜色作为显式参数…

- 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》

本文属于专栏《构建工业级QPS百万级服务》​​​​​ 1、前置知识 c的内存管理&#xff0c;主要说的是堆内存管理。现代计算机系统中&#xff0c;用户进程的堆内存&#xff0c;由内核映射。 堆内存的来源 主要是通过mmap()函数&#xff0c;在进程的虚拟地址空…

VueCLI核心知识综合案例TodoList

目录 1 拿到一个功能模块首先需要拆分组件&#xff1a; 2 使用组件实现静态页面的效果 3 分析数据保存在哪个组件 4 实现添加数据 5 实现复选框勾选 6 实现数据的删除 7 实现底部组件中数据的统计 8 实现勾选全部的小复选框来实现大复选框的勾选 9 实现勾选大复选框来…

OpenCV Mat 实例详解 二

构造函数 OpenCV Mat实例详解一中已介绍了部分OpenCV Mat构造函数&#xff0c;下面继续介绍剩余部分构造函数。 Mat (const std::vector< _Tp > &vec, bool copyDatafalse)&#xff1b; vec 包含数据的vec对象 copyData 是否拷贝数据&#xff0c;true— 拷贝数据&…

数据分析案例-基于亚马逊智能产品评论的探索性数据分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

亿级推送,得物是怎么架构的?

说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;很多小伙伴拿到一线互联网企业如阿里、网易、有赞、希音、百度、滴滴的面试资格。 最近&#xff0c;尼恩指导一个小伙伴简历&#xff0c;需要织入亮点项目、黄金项目。 前段时间&#xff0c;指导小伙写了一个《高…

AI在工业物联网(IIoT)中的安全管理与应用

在开放的工业互联网环境中&#xff0c;数百万个基于物联网的终端和中间设备&#xff0c;需要全天候地持续通信并保持在线状态。不过&#xff0c;这些设备往往由于最初设计上的限制&#xff0c;在机密性、完整性、可用性、扩展性、以及互操作性上&#xff0c;存在着各种安全漏洞…

Unity实现文字转语音并且与人物模型口型同步

文章目录 前言一、插件介绍二、导入RTVoice1.插件传送门2.组件配置 三、导入OVRLipSync1.插件传送门2.组件配置 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 今天我们用Unity实现文字转语音并且与人物模型口型同步&#xff0c;要实现这个功能&a…

Java安全 CC链6分析

CC链6分析 前言CC链分析核心transform链Lazymap类TiedMapEntry类HashMap方法 最终exp 前言 CC链6不受jdk版本与cs版本的影响&#xff0c;在Java安全中最为通用&#xff0c;并且非常简洁&#xff0c;非常有学习的必要&#xff0c;建议在学习CC链6之前先学习一下 URLDNS链 和 CC…

创建良好班风的重要性和意义

为什么有的班级总是充满活力&#xff0c;学生们团结友爱、学习热情高涨&#xff0c;而有的班级却显得沉闷&#xff0c;学生们缺乏动力&#xff0c;对学习毫无兴趣&#xff1f;其实&#xff0c;这背后的关键就在于班风的建设。 班风&#xff0c;简单说&#xff0c;就是一个班级…

IDEA在package下右键,没有new选项

正常情况下如下图&#xff0c;我们在文件夹上右键&#xff0c;是会出现New选项的。 但是今天我尝试将" add frameworks support"添加到右键时&#xff0c;竟然把New都删除了。如下图 搜遍全网&#xff0c;结果搜到的都是为什么在package或者文件夹上右键出现的Ne…

springboot185基于vue.js的客户关系管理系统(crm)的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…