1604. 警告一小时内使用相同员工卡大于等于三次的人

题目链接

题意

给定两个字符串数组keyNamekeyTime,分别表示名字为keytime[i]的人,在某一天内使用员工卡的时间(格式为24小时制,"HH:MM")。你要找出一小时内使用员工卡大于等于3的人,名字按字典序升序排列。注意,"23:51"-"00:10"不被视为一小时内,因为系统记录的是某一天内的使用情况

分析

给每个人创建一个数组,记录所有的打卡时间,然后将每个人名字字符串映射到相应的打卡时间数组。有个坑点是,题目给定的打卡时间不一定是顺序的,需要排序。另外,考虑到是记录当天的打卡时间,不妨将所有"HH:MM"换算为分钟制,比如"06:12"换算为\(372min\),便于后续判断。

class Solution {
public:
vector<string> alertNames(vector<string>& keyName, vector<string>& keyTime) {
unordered_map<string, vector<int>> t;
vector<string> ans;
for (int i = 0; i < keyName.size(); i++) {
string hours = keyTime[i].substr(0, 2);
string minutes = keyTime[i].substr(3, 2);
int dt = stoi(hours) * 60 + stoi(minutes);
t[keyName[i]].push_back(dt);
}
for (auto&& curName : t) {
vector<int> tt = curName.second;
if (tt.size() <= 2) continue;
sort(tt.begin(), tt.end());
for (int i = 2; i < tt.size(); i++) {
if (tt[i] - tt[i - 2] <= 60) {
ans.push_back(curName.first);
break;
}
}
}
sort(ans.begin(), ans.end());
return ans;
}
};

1605. 给定行和列的和求可行矩阵 #贪心 #稀疏矩阵

题目链接

题意

你不知道矩阵里每个元素的具体值,但已知每一行的总和和每一列的总和,求该矩阵。

分析

思路参考自@Durant。从\((0,0)\)元素出发,每到达一位置\((x, y)\),就判断当前位置对应的rowSum[x]colSum[x]最小值,假如这个最小值是​rowSum[x]​,那么就将该最小值直接放到ans[x][y]即可,将colSum[x] -= rowSum[x]; rowSum[x]=0;,对应的第\(x\)行其余元素全部置0,然后接下来移动到\((x+1, y)\)。假如这个最小值是colSum[x],同理。直到最终到达最后一行最后一列元素,即可终止。

class Solution {
public:
vector<vector<int>> restoreMatrix(vector<int>& rowSum, vector<int>& colSum) {
int n = rowSum.size(), m = colSum.size();
vector<vector<int>> ans(n, vector<int>(m, 0));
int i = 0, j = 0;
while (1) {
if (i >= n || j >= m) break;
int cur = min(rowSum[i], colSum[j]);
ans[i][j] = cur;
rowSum[i] -= cur; if (rowSum[i] == 0) i++;
colSum[j] -= cur; if (colSum[j] == 0) j++;
}
return ans;
}
};

1606. 找到处理最多请求的服务器 #STL #任务分配 #模拟

题目链接

题意

有\(k\)个服务器(编号从\(0\)开始),每个服务器不能同时处理超过一个的请求。第 \(i\)个请求到达时,请求分配到服务器的规则有:

  • 若所有服务器都已被占据,那么该请求被舍弃(完全不处理)。

  • 如果第$ (i % k)$ 个服务器空闲,那么对应服务器会处理该请求。

  • 否则,将请求安排给下一个空闲的服务器(服务器构成一个环,必要的话可能从第 0 个服务器开始继续找下一个空闲的服务器)。

给定一个 严格递增 的正整数数组 arrival ,其中arrival[i]表示第 $i $个任务的到达时间,和另一个数组 load ,其中 load[i] 表示第 $i $个请求的工作量(也就是服务器完成它所需要的时间)。你的任务是找到 最繁忙的服务器 。最繁忙定义为一个服务器处理的请求数是所有服务器里最多的。要返回包含所有 最繁忙服务器 序号的列表,你可以以任意顺序返回这个列表。

样例

分析

由于到达时间是\(1e9\)数量级,不可能直接枚举时间。我们应该用枚举“请求”的到达时间,如何维护服务器的工作状态?我们可以通过优先级队列,将工作中的服务器及对应的工作结束时间放到该队列中,工作时间结束得早,自然地就更早地放在队列队首或者弹出队列。怎么得知哪些服务器空闲?用\(set\)维护当前空闲服务器编号,之所以需要其自动排序的功能,是因为请求时是先从大到小寻找合适的编号的。由于\(set\)内部元素是顺序排列,那么我们自然通过二分查找到当前合适的服务器编号。这里,注意一下,对于\(set\)内部元素的查找,必须要用其自带的二分查找成员函数,否则会超时。具体原因戳此处的stackoverflow,感谢网友~

using PII = pair<int, int>;
class Solution {
public:
vector<int> busiestServers(int k, vector<int>& arrival, vector<int>& load) {
int n = arrival.size();
vector<int> cnt(k, 0); //cnt[i]表示第i个服务器接收请求次数
set<int> freeIdx; //表示当前空闲的服务器(set会对编号从小到大排序)
priority_queue<PII, vector<PII>, greater<PII>> busy; //值小优先级高,维护最快结束的服务器。pair的键对应该服务器结束时间,值对应于服务器编号
for (int i = 0; i < k; i++) freeIdx.emplace(i); //所有服务器空闲
for (int i = 0; i < n; i++) {
if (!freeIdx.empty()) {
auto it = freeIdx.lower_bound(i % k); //找到请求的服务器编号(大于等于)
int finish = arrival[i] + load[i], idx; //finish计算结束时间
if (it != freeIdx.end()) {
idx = *(it);
freeIdx.erase(it); //idx服务器不再空闲
}
else { //后面找不到,只能回到前面去找
idx = *(freeIdx.begin());
freeIdx.erase(freeIdx.begin());
}
busy.push({ finish, idx }); //idx服务器不再空闲
cnt[idx]++;
}
if (i + 1 < n) {
while (!busy.empty() && busy.top().first <= arrival[i + 1]) {
//如果某服务器工作结束时间比下一个请求的到达时间早,则
freeIdx.emplace(busy.top().second);//更新空闲服务器
busy.pop();
}
}
}
int most = -1; vector<int> ans;
for (int i = 0; i < k; i++) most = max(most, cnt[i]);
for (int i = 0; i < k; i++) if (cnt[i] == most) ans.push_back(i);
return ans;
}
};

LeetCode双周赛#36的更多相关文章

  1. leetcode 双周赛9 进击的骑士

    一个坐标可以从 -infinity 延伸到 +infinity 的 无限大的 棋盘上,你的 骑士 驻扎在坐标为 [0, 0] 的方格里. 骑士的走法和中国象棋中的马相似,走 “日” 字:即先向左(或右 ...

  2. leetcode 双周赛9 找出所有行中最小公共元素

    给你一个矩阵 mat,其中每一行的元素都已经按 递增 顺序排好了.请你帮忙找出在所有这些行中 最小的公共元素. 如果矩阵中没有这样的公共元素,就请返回 -1. 示例: 输入:mat = [[,,,,] ...

  3. [每日一题2020.06.16] leetcode双周赛T3 5423 找两个和为目标值且不重叠的子数组 DP, 前缀和

    题目链接 给你一个整数数组 arr 和一个整数值 target . 请你在 arr 中找 两个互不重叠的子数组 且它们的和都等于 target .可能会有多种方案,请你返回满足要求的两个子数组长度和的 ...

  4. LeetCode双周赛#35

    1589. 所有排列中的最大和 #差分 #贪心 题目链接 题意 给定整数数组nums,以及查询数组requests,其中requests[i] = [starti, endi] .第i个查询求 num ...

  5. LeetCode双周赛#34

    5492. 分割字符串的方案数 #组合公式 #乘法原理 #区间分割 题目链接 题意 给定01二进制串\(s\),可将\(s\)分割为三个非空 字符串\(s_1,s_2,s_3\),即(\(s_1+s_ ...

  6. LeetCode双周赛#33 题解

    5480. 可以到达所有点的最少点数目 #贪心 题目链接 题意 给定有向无环图,编号从0到n-1,一个边集数组edges(表示从某个顶点到另一顶点的有向边),现要找到最小的顶点集合,使得从这些点出发, ...

  7. Leetcode 双周赛#32 题解

    1540 K次操作转变字符串 #计数 题目链接 题意 给定两字符串\(s\)和\(t\),要求你在\(k\)次操作以内将字符串\(s\)转变为\(t\),其中第\(i\)次操作时,可选择如下操作: 选 ...

  8. LeetCode第8场双周赛(Java)

    这次我只做对一题. 原因是题目返回值类型有误,写的是 String[] ,实际上应该返回 List<String> . 好吧,只能自认倒霉.就当涨涨经验. 5068. 前后拼接 解题思路 ...

  9. LeetCode 第 15 场双周赛

    1287.有序数组中出现次数超过25%的元素 1288.删除被覆盖区间 1286.字母组合迭代器 1289.下降路径最小和 II 下降和不能只保留原数组中最小的两个,hacked. 1287.有序数组 ...

随机推荐

  1. 将书法字体制作成pcb库文件,并使用该字体作为logo印制在自己设计的电路板上。

    本文主要介绍,如何将写在纸张上的书法制作成pcb库文件,以达到如下效果: 形成具有镂空效果的标记,印制在PCB电路板上,一图logo位于top overlayer,是镂空丝印,二图位于top laye ...

  2. 使用阿里云镜像仓库构建国外 Docker 镜像

    使用阿里云镜像仓库下载国外镜像 在日常使用 Docker 或 K8S 的过程中,经常会需要到国外的网站中下载镜像,但是有些网站在国内是无法访问的.对于这个问题可以使用阿里云提供的镜像仓库进行下载,然后 ...

  3. Linux 环境编程:dirfd参数 有关解析

    背景 在Unix环境编程中,系统提供了很多以at结尾的函数,如openat.fstatat等,而这类函数通常有一个特点,就是形参列表中多了int dirfd 例如: int open(const ch ...

  4. 在pandas中使用pipe()提升代码可读性

    1 简介 我们在利用pandas开展数据分析时,应尽量避免过于碎片化的组织代码,尤其是创建出过多不必要的中间变量,既浪费了内存,又带来了关于变量命名的麻烦,更不利于整体分析过程代码的可读性,因此以流水 ...

  5. print( "Hello,NumPy!" )

    print( "Hello,NumPy!" ) 学习痛苦啊,今天学,明天丢.这种天气,还是睡觉最舒服了. 咱说归说,闹归闹,但还是得学才行啊. 之前在学习的过程中一直都有记录笔记的 ...

  6. 懒得写文档,swagger文档导出来不香吗

    导航 前言 离线文档 1 保存为html 2 导出成pdf文档 3 导出成Word文档 参考 前言   早前笔者曾经写过一篇文章<研发团队,请管好你的API文档>.团队协作中,开发文档的重 ...

  7. 【SpringBoot】09.SpringBoot整合Freemarker

    SpringBoot整合Freemarker 1.修改pom文件,添加坐标freemarker启动器坐标 <project xmlns="http://maven.apache.org ...

  8. 像用excel一样用pandas

    1 说明 预计需要15min阅读此教材: 本教材仅讲述如何查看excel数据,筛选,排序,查找替换数据,不涉及excel中复杂的图形绘制及样式修改. 2 假设 假设,已经存在一个test.xlsx文件 ...

  9. 利用Servlet做一套增删改查

    真的,稳住,考上研,利用两年逆袭.一步一步来,实在不行,最后最差也不过就是就回家种地,想想也不错. 前期准备配置 建一个动态web项目 新建Dynamic Web ProjectFile->Ne ...

  10. 转载:WIFI无线协议802.11a/b/g/n/ac的演变以及区别

    WIFI无线协议802.11a/b/g/n/ac的演变以及区别 版权声明:版权所有,转载须注明出处. https://blog.csdn.net/Brouce__Lee/article/details ...