leetcode_1213 三个有序数组的交集

71 阅读1分钟

要求

给出三个均为 严格递增排列 的整数数组 arr1arr2 和 arr3

返回一个由  在这三个数组中 同时出现 的整数所构成的有序数组。

示例:

输入: arr1 = [1,2,3,4,5], arr2 = [1,2,5,7,9], arr3 = [1,3,4,5,8]
输出: [1,5]
解释: 只有 15 同时在这三个数组中出现.

提示:

  • 1 <= arr1.length, arr2.length, arr3.length <= 1000
  • 1 <= arr1[i], arr2[i], arr3[i] <= 2000

核心代码

class Solution:
    def arraysIntersection(self, arr1: List[int], arr2: List[int], arr3: List[int]) -> List[int]:
        s1,s2,s3 = len(arr1),len(arr2),len(arr3)

        ans = []
        i1,i2,i3 = 0,0,0
        while i1 < s1 and i2 < s2 and i3 < s3:
            if arr1[i1] == arr2[i2] == arr3[i3]:
                ans.append(arr1[i1])
                i1 += 1
            else:
                v = max(arr1[i1],arr2[i2],arr3[i3])
                i1 = bisect.bisect_left(arr1,v,lo=i1)
                i2 = bisect.bisect_left(arr2,v,lo=i2)
                i3 = bisect.bisect_left(arr3,v,lo=i3)
        return ans

image.png

解题思路:二分查找,就是因为有序,所以我们在三个数相同的时候我们将其放入到结果字典之中,要是不同,我们取最大的数字,应为在循环无意,我们使用二分查找的方式,直接定位最近的数字,假设都相同则输出,不相同再次二分查找,一直到其中一个跳出循环,比较好的一道题。