class Solution {
public:
vector<int> arraysIntersection(vector<int>& arr1, vector<int>& arr2, vector<int>& arr3) {
}
};
1213. 三个有序数组的交集
给出三个均为 严格递增排列 的整数数组 arr1
,arr2
和 arr3
。返回一个由 仅 在这三个数组中 同时出现 的整数所构成的有序数组。
示例 1:
输入: arr1 = [1,2,3,4,5], arr2 = [1,2,5,7,9], arr3 = [1,3,4,5,8] 输出: [1,5] 解释: 只有 1 和 5 同时在这三个数组中出现.
示例 2:
输入: arr1 = [197,418,523,876,1356], arr2 = [501,880,1593,1710,1870], arr3 = [521,682,1337,1395,1764] 输出: []
提示:
1 <= arr1.length, arr2.length, arr3.length <= 1000
1 <= arr1[i], arr2[i], arr3[i] <= 2000
相似题目
原站题解
golang 解法, 执行用时: 0 ms, 内存消耗: 6.4 MB, 提交时间: 2023-10-15 18:27:28
func arraysIntersection(arr1 []int, arr2 []int, arr3 []int) []int { // 保存映射关系: // key : arr里的每个数字 // value : 出现的次数 var keyMap = make(map[int]int, 0) var res []int // 遍历三个数组,每遍历一个数字,该数字对应的出现次数+1 for _, v := range arr1 { keyMap[v]++ } for _, v := range arr2 { keyMap[v]++ } for _, v := range arr3 { keyMap[v]++ } // 找到所有值是3的,也就是三个数组中都有的数字 for i, v := range keyMap { if v == 3 { // 添加key到结果里 res = append(res, i) } } // 因为要求有序,所以排序 sort.Ints(res) return res }
golang 解法, 执行用时: 8 ms, 内存消耗: 4.1 MB, 提交时间: 2023-10-15 18:27:19
func arraysIntersection(arr1 []int, arr2 []int, arr3 []int) []int { var p1,p2,p3 int var ans []int for p1<len(arr1) && p2<len(arr2) && p3<len(arr3){ if arr1[p1]==arr2[p2] && arr2[p2]==arr3[p3]{ ans = append(ans, arr1[p1]) p1++ p2++ p3++ }else{ m := min(min(arr1[p1],arr2[p2]),arr3[p3]) if arr1[p1]==m{ p1++ } if arr2[p2]==m{ p2++ } if arr3[p3]==m{ p3++ } } } return ans } func min(a, b int) int { if a < b { return a }; return b }
python3 解法, 执行用时: 44 ms, 内存消耗: 16.4 MB, 提交时间: 2023-10-15 18:25:48
class Solution: def arraysIntersection(self, arr1: List[int], arr2: List[int], arr3: List[int]) -> List[int]: ans = [] # 你可以用字典来计算频率 # 或者您可以使用集合。 # 更多信息可以在这里找到: # https://docs.python.org/3/library/collections.html counter = collections.Counter(arr1 + arr2 + arr3) # concatenate them together for item in counter: if counter[item] == 3: ans.append(item) return ans def arraysIntersection2(self, arr1: List[int], arr2: List[int], arr3: List[int]) -> List[int]: ans = [] # 准备三个指针来迭代三个数组 # p1、p2和p3分别指向arr1、arr2和arr3的起始点 p1 = p2 = p3 = 0 while p1 < len(arr1) and p2 < len(arr2) and p3 < len(arr3): if arr1[p1] == arr2[p2] == arr3[p3]: ans.append(arr1[p1]) p1 += 1 p2 += 1 p3 += 1 else: if arr1[p1] < arr2[p2]: p1 += 1 elif arr2[p2] < arr3[p3]: p2 += 1 else: p3 += 1 return ans
java 解法, 执行用时: 18 ms, 内存消耗: 42.9 MB, 提交时间: 2023-10-15 18:25:16
class Solution { public List<Integer> arraysIntersection(int[] arr1, int[] arr2, int[] arr3) { List<Integer> ans = new ArrayList<>(); // 注意 HashMap 不能在这里使用,因为它不能保证键的顺序 Map<Integer, Integer> counter = new TreeMap<>(); // 迭代 arr1、arr2 和 arr3 来计算频率 for (Integer e: arr1) { counter.put(e, counter.getOrDefault(e, 0) + 1); } for (Integer e: arr2) { counter.put(e, counter.getOrDefault(e, 0) + 1); } for (Integer e: arr3) { counter.put(e, counter.getOrDefault(e, 0) + 1); } for (Integer item: counter.keySet()) { if (counter.get(item) == 3) { ans.add(item); } } return ans; } public List<Integer> arraysIntersection2(int[] arr1, int[] arr2, int[] arr3) { List<Integer> ans = new ArrayList <>(); // 准备三个指针来迭代三个数组 // p1、p2和p3分别指向arr1、arr2和arr3的起始点 int p1 = 0, p2 = 0, p3 = 0; while (p1 < arr1.length && p2 < arr2.length && p3 < arr3.length) { if (arr1[p1] == arr2[p2] && arr2[p2] == arr3[p3]) { ans.add(arr1[p1]); p1++; p2++; p3++; } else { if (arr1[p1] < arr2[p2]) { p1++; } else if (arr2[p2] < arr3[p3]) { p2++; } else { p3++; } } } return ans; } }