LeetCode 第 287 场周赛题解及思路

本文介绍了LeetCode第287场周赛的四道题目,包括转化时间需要的最少操作数、找出输掉零场或一场比赛的玩家、每个小孩最多能分到多少糖果以及加密解密字符串。针对每道题目,作者提供了思路和解决方案,如使用贪心策略求最少操作数,利用哈希表记录比赛胜败情况,二分法求解糖果分配,以及通过逆向思维解决解密字符串问题。文章最后分享了作者在解题过程中的思考和经验总结。
摘要由CSDN通过智能技术生成

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 需要的 最少操作数

提示:

  • currentcorrect 都符合 "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)

因为时间的增加值只能是 151560 这几个 时间片,就像硬币找零一样,我们可以使用 贪心 的策略来求出最少的操作次数,即每次都选取尽量大的 时间片 相加直到得到 目标时间

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值