要求
给出三个均为 严格递增排列 的整数数组 arr1
,arr2
和 arr3
。
返回一个由 仅 在这三个数组中 同时出现 的整数所构成的有序数组。
示例:
输入: arr1 = [1,2,3,4,5], arr2 = [1,2,5,7,9], arr3 = [1,3,4,5,8]
输出: [1,5]
解释: 只有 1 和 5 同时在这三个数组中出现.
提示:
- 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
解题思路:二分查找
,就是因为有序,所以我们在三个数相同的时候我们将其放入到结果字典之中,要是不同,我们取最大的数字,应为在循环无意,我们使用二分查找的方式,直接定位最近的数字,假设都相同则输出,不相同再次二分查找,一直到其中一个跳出循环,比较好的一道题。