📌  相关文章
📜  在三个排序的数组中查找共同的元素(1)

📅  最后修改于: 2023-12-03 15:07:56.990000             🧑  作者: Mango

在三个排序的数组中查找共同的元素
问题描述

给定三个已经排序的数组,编写一个函数来查找它们的公共元素。如果不存在公共元素,则返回空数组。

例子
# 输入
arr1 = [1, 2, 3, 4, 5]
arr2 = [2, 3, 4, 5, 6]
arr3 = [3, 4, 5, 6, 7]

# 输出
[4, 5]
解决方案

由于三个数组都已经排序,我们可以通过遍历三个数组,比较它们当前指向的元素,来确定它们的公共元素。具体步骤如下:

  1. 定义三个指针 ijk 分别指向三个数组的第一个元素。
  2. 比较三个指针指向的元素是否相等,若相等,则将元素加入结果集中,并将三个指针同时向后移动一位。
  3. 如果三个指针指向的元素不相等,则将最小元素的指针向后移动一位。

代码如下:

def find_common_elements(arr1, arr2, arr3):
    i, j, k = 0, 0, 0  # 初始化三个指针

    res = []
    while i < len(arr1) and j < len(arr2) and k < len(arr3):
        if arr1[i] == arr2[j] == arr3[k]:  # 找到公共元素
            res.append(arr1[i])
            i += 1
            j += 1
            k += 1
        else:
            # 移动最小元素指针
            min_val = min(arr1[i], arr2[j], arr3[k])
            if arr1[i] == min_val:
                i += 1
            elif arr2[j] == min_val:
                j += 1
            else:
                k += 1

    return res
总结

本题的时间复杂度为 $O(N)$,其中 $N$ 为三个数组中元素的总数。可以通过使用三个指针的方法来遍历三个数组,判断是否存在公共元素,并在 $O(1)$ 的时间内将指针向后移动。