leetcode weekly contes 371
周赛题目还算不算,虽然晚了半个小时,还好都 AK 了。T4也算是经典的题目了,基本上看到就被秒杀的题目。
100120. 找出强数对的最大异或值 I
给你一个下标从 0 开始的整数数组 nums 。如果一对整数 x 和 y 满足以下条件,则称其为 强数对 :
|x - y| <= min(x, y)
你需要从 nums 中选出两个整数,且满足:这两个整数可以形成一个强数对,并且它们的按位异或(XOR)值是在该数组所有强数对中的 最大值 。
返回数组 nums 所有可能的强数对中的 最大 异或值。
注意,你可以选择同一个整数两次来形成一个强数对。
示例 1:
输入:nums = [1,2,3,4,5] |
示例 2:
输入:nums = [10,100] |
示例 3:
输入:nums = [5,6,25,30] |
提示:
1 <= nums.length <= 501 <= nums[i] <= 100
地址
https://leetcode.cn/contest/weekly-contest-371/problems/maximum-strong-pair-xor-i/
题意
枚举
思路
- 直接枚举所有的数对 $x,y$, 找到最大的 $x \oplus y$ 的最大值。
- 复杂度分析:
- 时间复杂度:$O(n^2)$,其中 $n$ 表示给定的数组的长度。
- 空间复杂度:$O(1)$。
代码
class Solution: |
100128. 高访问员工
给你一个长度为 n 、下标从 0 开始的二维字符串数组 access_times 。对于每个 i(0 <= i <= n - 1 ),access_times[i][0] 表示某位员工的姓名,access_times[i][1] 表示该员工的访问时间。access_times 中的所有条目都发生在同一天内。
访问时间用 四位 数字表示, 符合 24 小时制 ,例如 "0800" 或 "2250" 。
如果员工在 同一小时内 访问系统 三次或更多 ,则称其为 高访问 员工。
时间间隔正好相差一小时的时间 不 被视为同一小时内。例如,"0815" 和 "0915" 不属于同一小时内。
一天开始和结束时的访问时间不被计算为同一小时内。例如,"0005" 和 "2350" 不属于同一小时内。
以列表形式,按任意顺序,返回所有 高访问 员工的姓名。
示例 1:
输入:access_times = [["a","0549"],["b","0457"],["a","0532"],["a","0621"],["b","0540"]] |
示例 2:
输入:access_times = [["d","0002"],["c","0808"],["c","0829"],["e","0215"],["d","1508"],["d","1444"],["d","1410"],["c","0809"]] |
示例 3:
输入:access_times = [["cd","1025"],["ab","1025"],["cd","1046"],["cd","1055"],["ab","1124"],["ab","1120"]] |
提示:
1 <= access_times.length <= 100access_times[i].length == 21 <= access_times[i][0].length <= 10access_times[i][0]仅由小写英文字母组成。access_times[i][1].length == 4access_times[i][1]采用24小时制表示时间。access_times[i][1]仅由数字'0'到'9'组成。
地址
https://leetcode.cn/contest/weekly-contest-371/problems/high-access-employees/
题意
枚举
思路
- 题目要求找到不超过存在在不到一时间内访问超过三次的员工,首先我们需要处理的是将 $24$ 小时时间转化为分钟,然后将每个员工的访问时间按照从小到到大进行排序,如果出现连续三次的间隔小于 $60$,则该员工符合题目要求。
- 复杂度分析:
- 时间复杂度:$O(n)$,其中 $n$ 表示给定数组的长度。
- 空间复杂度:$O(n)$,其中 $n$ 表示给定数组的长度。
代码
class Solution: |
2934. 最大化数组末位元素的最少操作次数
给你两个下标从 0 开始的整数数组 nums1 和 nums2 ,这两个数组的长度都是 n 。
你可以执行一系列 操作(可能不执行)。
在每次操作中,你可以选择一个在范围 [0, n - 1] 内的下标 i ,并交换 nums1[i] 和 nums2[i] 的值。
你的任务是找到满足以下条件所需的 最小 操作次数:
nums1[n - 1]等于nums1中所有元素的 最大值 ,即nums1[n - 1] = max(nums1[0], nums1[1], ..., nums1[n - 1])。nums2[n - 1]等于nums2中所有元素的 最大值 ,即nums2[n - 1] = max(nums2[0], nums2[1], ..., nums2[n - 1])。
以整数形式,表示并返回满足上述 全部 条件所需的 最小 操作次数,如果无法同时满足两个条件,则返回 -1 。
示例 1:
输入:nums1 = [1,2,7],nums2 = [4,5,3] |
示例 2:
输入:nums1 = [2,3,4,5,9],nums2 = [8,8,4,4,4] |
示例 3:
输入:nums1 = [1,5,4],nums2 = [2,5,3] |
提示:
1 <= n == nums1.length == nums2.length <= 10001 <= nums1[i] <= 1091 <= nums2[i] <= 109
地址
题意
模拟
思路
- 题目看齐来很长,但实际该题目很简单,无论如何交换,最末位数只有两种情况,数组的最后两个元素要么不交换,在这两种情况下分别计算前 $n-1$ 个元素都小于最大元素所需的最少交换次数即可。
- 时间复杂度:$O(n)$,其中$n$ 表示数组的长度;
- 空间复杂度:$O(1)$;
代码
class Solution: |
2935. 找出强数对的最大异或值 II
给你一个下标从 0 开始的整数数组 nums 。如果一对整数 x 和 y 满足以下条件,则称其为 强数对 :
|x - y| <= min(x, y)
你需要从 nums 中选出两个整数,且满足:这两个整数可以形成一个强数对,并且它们的按位异或(XOR)值是在该数组所有强数对中的 最大值 。
返回数组 nums 所有可能的强数对中的 最大 异或值。
注意,你可以选择同一个整数两次来形成一个强数对。
示例 1:
输入:nums = [1,2,3,4,5] |
示例 2:
输入:nums = [10,100] |
示例 3:
输入:nums = [500,520,2500,3000] |
提示:
1 <= nums.length <= 5 * 1041 <= nums[i] <= 220 - 1
地址
https://leetcode.cn/contest/weekly-contest-371/problems/maximum-strong-pair-xor-ii/
题意
trie树
思路
- 看到本题就想到力扣中的某个原题,因为要求最大的异或值,此时我们自然想到了使用
trie树,尽量从高位低位找到数组中与当前元素,实际可以参考421. 数组中两个数的最大异或值 几乎是一样的题目,不过这里加了一个双指针与滑动窗口的问题,因此题目就变的非常简单了,题目的关键在于 $|x-y| \le min(x, y)$,即等价于 $2 * \min(x, y) >= \max(x,y)$,我们将数组按照从小到大进行排序,及遍历到当前元素 $nums[i]$ 时,找到范围处在 $nums[j] \in [\dfrac{nums[i]}{2}, nums[i]]$ 之间的元素 $nums[j]$ 即可,并将这些元素插入到字典树中,所有小于 $\dfrac{nums[i]}{2}$ 的元素则从字典树中删除,然后从字典树中查找与 $nums[i]$ 异或的最大值的元素。 - 复杂度分析:
- 时间复杂度:$O(n \log U)$,其中 $n$ 表示数组的长度,$U$ 表示数组中的最大长度,我们分别存储
- 空间复杂度:$O(n \log n)$,其中 $n$ 表示数组的长度,$U$ 表示数组中的最大长度;
代码
class TrieNode: |
欢迎关注和打赏,感谢支持!
- 关注我的博客: http://whistle-wind.com/
- 关注我的知乎:https://www.zhihu.com/people/da-hua-niu
- 关注我的微信公众号: 公务程序猿

扫描二维码,分享此文章