📅  最后修改于: 2023-12-03 14:54:44.414000             🧑  作者: Mango
该题目来自于 力扣(LeetCode)第 2032 题,题目描述如下:
给你三个整数数组 nums1
、nums2
和 nums3
。请你构造并返回一个由 仅 在这三个数组中 同时出现 的元素所构成的有序数组。
输入:nums1 = [1,1,3,2], nums2 = [2,3], nums3 = [3]
输出:[3,2]
解释:只有 3 和 2 同时在这三个数组中出现.
该题思路较为简单,需要将三个数组中同时出现的元素取出来,所以需要对三个数组均遍历一遍,找出符合条件的元素,在最后用 set()
将重复元素去掉并排序。
值得注意的是本题中 MEX 的概念,是墨西哥人的传统组队游戏。在这个游戏中,一群人轮流报数,从 1 开始报数。每当轮到某个人报数时,他需要说出由 0
、1
组成的以此编号的最小自然数(不在集合中的最小正整数)的集合。例如,第一个人轮到时,他需要说出的 MEX 是 1
,因为集合中包含 0
,但不包含 1
。如果当前集合中已经包含了某个数 x,那么报出的 MEX 就是 x+1。请你在游戏中帮助你的好朋友求出他说的每个 MEX 。
所以需要先对三个数组进行排序,后遍历数组,对符合条件的元素进行插入,插入元素满足 MEX 以及数组最大 K 次平均值。
class Solution:
def twoOutOfThree(self, nums1: List[int], nums2: List[int], nums3: List[int]) -> List[int]:
nums1.sort()
nums2.sort()
nums3.sort()
ans = []
n, m, l = len(nums1), len(nums2), len(nums3)
i, j, k = 0, 0, 0
cnt = [0] * 2001
while i < n:
cnt[nums1[i]] += 1
i += 1
while j < m:
cnt[nums2[j]] += 1
j += 1
while k < l:
cnt[nums3[k]] += 1
k += 1
i, j, k = 0, 0, 0
while i < n and j < m and k < l:
x = min(nums1[i], nums2[j], nums3[k])
if cnt[x] == 2:
ans.append(x)
cnt[nums1[i]] -= 1
cnt[nums2[j]] -= 1
cnt[nums3[k]] -= 1
i += nums1[i] == x
j += nums2[j] == x
k += nums3[k] == x
return ans
以上就是对该题目的讲解,如果还有疑问,欢迎在评论区提出您的问题。