复盘|第87场双周赛
2409. 统计共同度过的日子数 https://leetcode.cn/problems/count-days-spent-together/
【模拟】把字符串日期转换成这一年的第几天,然后二者交集区间end的一年第几天 减去 start的一年第几天就是答案。
【调库】用datetime.datetime的days算天数。
【调库】用datetime.date的days算天数。
2410. 运动员和训练师的最大匹配数 https://leetcode.cn/problems/maximum-matching-of-players-with-trainers/
【排序 + 贪心】每个运动员都应该找能力值大于等于且最接近自己的训练师。
2411. 按位或最大的最小子数组长度 https://leetcode.cn/problems/smallest-subarrays-with-maximum-bitwise-or/
【逆序遍历】题意是找每个以i为起点的最短子数组,满足或运算结果最大,那么需要使得二进制表示的1尽可能多。可以用一个32位的数组记录每一位1最早出现的位置。逆序遍历,枚举每个数,如果同一二进制位存在 1 的话,保留最小的下标,如果第j位存在1,更新pos - i + 1。
【优化后的逆序遍历】正序遍历nums[i],从i-1逆序遍历nums[j],如果num[j] | nums[i] != nums[j],说明num[j]变大了,更新nums[j],如果num[j] | nums[i] == nums[j],说明nums[i]是nums[j]和nums[k] (k < j)的子集。
2412. 完成所有交易的初始最少钱数 https://leetcode.cn/problems/minimum-money-required-before-transactions/
【贪心】题意要求至少多少启动资金能完成所有交易,所以要从最坏情况考虑,即对于每一次交易,都先把所有亏钱交易进行之后在进行本次交易,对于一次赚钱交易,初始资金至少为此前全部亏钱+本次交易入场费;对于一次亏钱交易,初始资金至少为此前全部亏钱+当前交易将要净亏的钱(以保证本次交易后结束后不会破产)。代码中,total_lose为所有亏的钱,total_lose = sum(cost - cashback),对于cost _i<= cashback_i的交易,初始资金 = total_lose + cost_i,对于cost_i > cashback_i的交易,初始资金 = total_lose + cost_i - (cost_i - cashback_i) = total_lose + cashback_i。遍历每次交易,记录max(total_lose + cashback, total_lose + cost)。
不用python的max函数,速度会更快。