九章算法 | 谷歌面试题:多个数组的交集

给出多个数组,求它们的交集。输出他们交集的大小。

在线评测地址:LintCode 领扣

样例 1:

        	输入:  [[1,2,3],[3,4,5],[3,9,10]]
	输出:  1
	
	解释:
	只有3出现在三个数组中。
      

样例 2:

        	输入: [[1,2,3,4],[1,2,5,6,7][9,10,1,5,2,3]]
	输出:  2
	
	解释:
	交集是[1,2].
      

【题解】

解题思路

由于题目数据中每个数组里的元素都没有重复,而这道题目又要求求交集,交集中的元素一定在每一个数组中都出现过,所以交集中的元素在所有数组中的出现次数一定等于数组个数。所以使用MapPython中的字典数据结构就可以统计数字出现的次数,就可以解决问题了。

代码思路

  1. 建立映射。
  2. 统计所有数字出现的次数。
  3. 在映射的键值集合中找出出现次数等于数组个数的数量。

复杂度分析

设总的数字个数为N

时间复杂度

  • 在哈希表实现中时间复杂度是O(N),在二叉树实现中,时间复杂度是O(NlogN)

空间复杂度

  • 空间复杂度为O(N)
        public class Solution {
    /**
     * @param arrs: the arrays
     * @return: the number of the intersection of the arrays
     */
    public int intersectionOfArrays(int[][] arrs) {
        Map<Integer, Integer> count = new HashMap<Integer, Integer>();
        // 记录每个数的出现次数
        for (int[] arr: arrs) {
            for (int x: arr) {
                if (! count.containsKey(x)) {
                    count.put(x, 0);
                }
                count.put(x, (int)count.get(x) + 1);
            }
        }
        // 某个数出现次数等于数组个数,代表它在所有数组中都出现过
        int result = 0;
        for (int x: count.keySet()) {
            if (count.get(x) == arrs.length) {
                result++;
            }
        }
        return result;
    }
}
      

更多题解参见:九章算法

你可能感兴趣的:(九章算法 | 谷歌面试题:多个数组的交集)