LeetCode 第 287 场周赛 题解及思路
2022-04-03
赛题传送门
6055. 转化时间需要的最少操作数
给你两个字符串 current 和 correct ,表示两个 24 小时制时间 。
24 小时制时间 按 “HH:MM” 进行格式化,其中 HH 在 00 和 23 之间,而 MM 在 00 和 59 之间。最早的 24 小时制时间为 00:00 ,最晚的是 23:59 。
在一步操作中,你可以将 current 这个时间增加 1、5、15 或 60 分钟。你可以执行这一操作 任意 次数。
返回将 current 转化为 correct 需要的 最少操作数 。
提示:
current
和correct
都符合"HH:MM"
格式。current <= correct
我想着先把这两个时间做个 减法 算出 时间差值(分钟计算),那肯定先把 小时 和 分钟 弄出来。
int hour1 = stol(current.substr(0, 2)), minute1 = stol(current.substr(3, 2));
int hour2 = stol(correct.substr(0, 2)), minute2 = stol(correct.substr(3, 2));
根据题目限制 current <= correct
所以不需要考虑从 current
要经过晚上 11:59
之后才能到达 correct
的情况。
于是我们直接计算出两个时间之间的差值 diff
,以分钟为单位。
int diff = (hour2 - hour1) * 60 + (minute2 - minute1)
因为时间的增加值只能是 1
、5
、15
、60
这几个 时间片,就像硬币找零一样,我们可以使用 贪心 的策略来求出最少的操作次数,即每次都选取尽量大的 时间片 相加直到得到 目标时间。
int ans = 0;
ans += diff / 60; diff %= 60;
ans += diff / 15; diff %= 15;
ans += diff / 5; diff %= 5;
ans += diff / 1; diff %= 1;
则由 current
转化为 correct
需要的最少操作数就是 ans
。完整代码见 GitHub。
5235. 找出输掉零场或一场比赛的玩家
给你一个整数数组
matches
其中matches[i] = [winneri, loseri]
表示在一场比赛中winneri
击败了loseri
。
- 返回一个长度为 2 的列表
answer
:answer[0]
是所有 没有 输掉任何比赛的玩家列表。answer[1]
是所有恰好输掉 一场 比赛的玩家列表。两个列表中的值都应该按 递增 顺序返回。
注意:
- 只考虑那些参与 至少一场 比赛的玩家。
- 生成的测试用例保证 不存在 两场比赛结果 相同 。\
提示
1 <= matches.length <= 10^5
matches[i].length == 2
1 <= winner