列表

详情


1213. 三个有序数组的交集

给出三个均为 严格递增排列 的整数数组 arr1arr2 和 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]
输出: []

 

提示:

相似题目

两个数组的交集

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: vector<int> arraysIntersection(vector<int>& arr1, vector<int>& arr2, vector<int>& arr3) { } };

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;
   }
}

上一题