输入:三个 严格递增排序 的整数数组 arr1、arr2、arr3。
输出:仅在三个数组中 同时出现 的整数构成的有序数组。
思路:三指针同步遍历法
- 定义三个指针
i,j,k,分别指向三个数组当前考察的位置。 - 当
arr1[i] == arr2[j] == arr3[k]时,说明该元素同时存在于三个数组中,加入结果并同时前进。 - 否则,找到当前三个值中的最小值,让指向该最小值的指针前进(因为小的值不可能再出现在其他数组中)。
- 当任意一个数组遍历结束时,交集计算完成。
时间复杂度:O(n)
空间复杂度:O(1)
class Solution {
public:
vector<int> arraysIntersection(vector<int>& arr1, vector<int>& arr2, vector<int>& arr3) {
int i = 0, j = 0, k = 0;
vector<int> result;
while (i < arr1.size() && j < arr2.size() && k < arr3.size()) {
// 三个相等 -> 加入结果并前进
if (arr1[i] == arr2[j] && arr2[j] == arr3[k]) {
result.push_back(arr1[i]);
i++, j++, k++;
}
// 找出最小值并前进
else {
int minVal = min({arr1[i], arr2[j], arr3[k]});
if (arr1[i] == minVal) i++;
if (arr2[j] == minVal) j++;
if (arr3[k] == minVal) k++;
}
}
return result;
}
};
280

被折叠的 条评论
为什么被折叠?



