leetcode
leetcode 2501 ~ 2550
找到两个数组中的公共元素

找到两个数组中的公共元素

难度:

标签:

题目描述

You are given two 0-indexed integer arrays nums1 and nums2 of sizes n and m, respectively.

Consider calculating the following values:

  • The number of indices i such that 0 <= i < n and nums1[i] occurs at least once in nums2.
  • The number of indices i such that 0 <= i < m and nums2[i] occurs at least once in nums1.

Return an integer array answer of size 2 containing the two values in the above order.

 

Example 1:

Input: nums1 = [4,3,2,3,1], nums2 = [2,2,5,2,3,6]
Output: [3,4]
Explanation: We calculate the values as follows:
- The elements at indices 1, 2, and 3 in nums1 occur at least once in nums2. So the first value is 3.
- The elements at indices 0, 1, 3, and 4 in nums2 occur at least once in nums1. So the second value is 4.

Example 2:

Input: nums1 = [3,4,2,3], nums2 = [1,5]
Output: [0,0]
Explanation: There are no common elements between the two arrays, so the two values will be 0.

 

Constraints:

  • n == nums1.length
  • m == nums2.length
  • 1 <= n, m <= 100
  • 1 <= nums1[i], nums2[i] <= 100

代码结果

运行时间: 32 ms, 内存: 16.6 MB


/*
 * 思路:
 * 1. 使用 Java Stream API,将 nums2 转换为集合,以快速查找 nums1 中的元素。
 * 2. 使用 Stream 过滤 nums1 中存在于 nums2 集合中的元素并计数。
 * 3. 同样的方法对 nums2 进行操作,计算存在于 nums1 集合中的元素个数。
 * 4. 返回结果数组,其中第一个元素为 nums1 中的计数,第二个元素为 nums2 中的计数。
 */
import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;

public class Solution {
    public int[] countMatches(int[] nums1, int[] nums2) {
        Set<Integer> setNums2 = Arrays.stream(nums2).boxed().collect(Collectors.toSet());
        long count1 = Arrays.stream(nums1).filter(setNums2::contains).count();

        Set<Integer> setNums1 = Arrays.stream(nums1).boxed().collect(Collectors.toSet());
        long count2 = Arrays.stream(nums2).filter(setNums1::contains).count();

        return new int[]{(int) count1, (int) count2};
    }
}

解释

方法:

此题解使用了集合来找出两个数组中的公共元素。首先,将nums1和nums2转换为集合set1和set2,这样可以去除重复元素,并且利用集合的高效查找特性。然后,分别计算nums1中有多少个元素存在于set2中,以及nums2中有多少个元素存在于set1中。这两个计数结果构成了最终的返回值。

时间复杂度:

O(n + m)

空间复杂度:

O(n + m)

代码细节讲解

🦆
在这个解法中,为什么选择使用集合而不是其他数据结构来处理元素查找?
集合(Set)在Python中是基于哈希表实现的,这使得其查找操作的时间复杂度平均为O(1),远比列表的O(n)要高效。使用集合可以快速地检查一个元素是否存在于集合中,这对于本题中需要频繁进行元素查找的操作非常有利。此外,集合自动去除重复元素,这也简化了处理过程。
🦆
在计算nums1中的元素是否存在于set2中时,代码使用了生成器表达式而非列表推导,这样做有什么优点?
使用生成器表达式而非列表推导的主要优点是内存效率。生成器表达式会产生一个生成器对象,它是一个迭代器,按需计算每个元素,而不是一次性地将所有元素计算出来并存储在内存中。这意味着对于大数据集处理时,可以减少程序的内存使用,提高效率。
🦆
代码中使用`sum(1 for num in nums1 if num in set2)`来计算匹配的元素数量,是否有更直观或效率更高的实现方式?
一个更直观的实现方式是使用集合的交集操作,例如 `len(set1 & set2)` 来直接计算两个集合中共同元素的数量。这不仅代码更简洁,而且利用了集合操作的内部优化,可能在某些情况下比手动迭代检查每个元素更高效。
🦆
本题解中有考虑到元素的顺序对结果的影响吗,如果数组中的元素顺序变化,输出结果会受到影响吗?
在这个题解中,使用的集合并不考虑元素的顺序,只关注元素是否存在。因此,无论数组中元素的顺序如何变化,只要元素的内容不变,最终的输出结果(即两个数组中公共元素的数量)是不会受到影响的。这是因为集合是一种无序的数据结构,只关心元素的存在与否。

相关问题