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

2024-02-15 16:04

本文主要是介绍华为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}
};

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

请添加图片描述

这篇关于华为23年9月笔试原题,巨详细题解,附有LeetCode测试链接的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/711853

相关文章

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

2025版mysql8.0.41 winx64 手动安装详细教程

《2025版mysql8.0.41winx64手动安装详细教程》本文指导Windows系统下MySQL安装配置,包含解压、设置环境变量、my.ini配置、初始化密码获取、服务安装与手动启动等步骤,... 目录一、下载安装包二、配置环境变量三、安装配置四、启动 mysql 服务,修改密码一、下载安装包安装地

在macOS上安装jenv管理JDK版本的详细步骤

《在macOS上安装jenv管理JDK版本的详细步骤》jEnv是一个命令行工具,正如它的官网所宣称的那样,它是来让你忘记怎么配置JAVA_HOME环境变量的神队友,:本文主要介绍在macOS上安装... 目录前言安装 jenv添加 JDK 版本到 jenv切换 JDK 版本总结前言China编程在开发 Java

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat

如何在Java Spring实现异步执行(详细篇)

《如何在JavaSpring实现异步执行(详细篇)》Spring框架通过@Async、Executor等实现异步执行,提升系统性能与响应速度,支持自定义线程池管理并发,本文给大家介绍如何在Sprin... 目录前言1. 使用 @Async 实现异步执行1.1 启用异步执行支持1.2 创建异步方法1.3 调用

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

SpringBoot改造MCP服务器的详细说明(StreamableHTTP 类型)

《SpringBoot改造MCP服务器的详细说明(StreamableHTTP类型)》本文介绍了SpringBoot如何实现MCPStreamableHTTP服务器,并且使用CherryStudio... 目录SpringBoot改造MCP服务器(StreamableHTTP)1 项目说明2 使用说明2.1

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java