📌  相关文章
📜  插入 MEX 和 Array Max K 次平均值后的唯一元素计数(1)

📅  最后修改于: 2023-12-03 14:54:44.414000             🧑  作者: Mango

插入 MEX 和 Array Max K 次平均值后的唯一元素计数

简介

该题目来自于 力扣(LeetCode)第 2032 题,题目描述如下:

给你三个整数数组 nums1nums2nums3 。请你构造并返回一个由 在这三个数组中 同时出现 的元素所构成的有序数组。

示例
输入:nums1 = [1,1,3,2], nums2 = [2,3], nums3 = [3]
输出:[3,2]
解释:只有 3 和 2 同时在这三个数组中出现.
思路

该题思路较为简单,需要将三个数组中同时出现的元素取出来,所以需要对三个数组均遍历一遍,找出符合条件的元素,在最后用 set() 将重复元素去掉并排序。
值得注意的是本题中 MEX 的概念,是墨西哥人的传统组队游戏。在这个游戏中,一群人轮流报数,从 1 开始报数。每当轮到某个人报数时,他需要说出由 01 组成的以此编号的最小自然数(不在集合中的最小正整数)的集合。例如,第一个人轮到时,他需要说出的 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

以上就是对该题目的讲解,如果还有疑问,欢迎在评论区提出您的问题。