Pythonプログラマは、本をインタビュー---問題解決のアルゴリズムの概要:第4章アレイの4.22を3つの命じた配列から彼らの共通の要素を見つける方法

# -*- coding: utf-8 -*-

'''
Python程序员面试算法宝典---解题总结: 第4章 数组 4.22 如何从三个有序数组中找出它们的公共元素

题目:
给定以非递减顺序排序的三个数组,找出这三个数组中的所有公共元素。例如,
给出下面三个数组:
ar1 = [2, 5, 12, 20, 45, 85]
ar2 = [16, 19, 20, 85, 200]
ar3 = [3, 4, 15, 20, 39, 72, 85, 190]
那么这三个数组的公共元素为[20, 85]。

分析:
可以分别令三个数组遍历下标为i,j,k
初始都为0,
然后如果ar1[i] = ar2[j] = ar3[k]
那么ar1[i]就是公共元素;
否则,从3个元素中找出最小的两个元素所在的数组对应的
遍历下标,让遍历下标都+1.
继续重复上述循环,直到遍历完所有数组。

关键:

参考:
Python程序员面试算法宝典
'''


def findCommonElements(ar1, ar2, ar3):
    results = []
    if not ar1 or not ar2 or not ar3:
        return results
    len1 = len(ar1)
    len2 = len(ar2)
    len3 = len(ar3)
    i = 0
    j = 0
    k = 0
    while i < len1 and j < len2 and k < len3:
        if ar1[i] == ar2[j] and ar1[i] == ar3[k]:
            results.append(ar1[i])
            i += 1
            j += 1
            k += 1
        else:
            maxValue = max(ar1[i], ar2[j], ar3[k])
            if ar1[i] != maxValue:
                i += 1
            if ar2[j] != maxValue:
                j += 1
            if ar3[k] != maxValue:
                k += 1
    return results


def process():
    ar1 = [2, 5, 12, 20, 45, 85]
    ar2 = [16, 19, 20, 85, 200]
    ar3 = [3, 4, 15, 20, 39, 72, 85, 190]
    results = findCommonElements(ar1, ar2, ar3)
    print results


if __name__ == "__main__":
    process()

 

おすすめ

転載: blog.csdn.net/qingyuanluofeng/article/details/93662500