leetcode
leetcode 2201 ~ 2250
最小公共值

最小公共值

难度:

标签:

题目描述

Given two integer arrays nums1 and nums2, sorted in non-decreasing order, return the minimum integer common to both arrays. If there is no common integer amongst nums1 and nums2, return -1.

Note that an integer is said to be common to nums1 and nums2 if both arrays have at least one occurrence of that integer.

 

Example 1:

Input: nums1 = [1,2,3], nums2 = [2,4]
Output: 2
Explanation: The smallest element common to both arrays is 2, so we return 2.

Example 2:

Input: nums1 = [1,2,3,6], nums2 = [2,3,4,5]
Output: 2
Explanation: There are two common elements in the array 2 and 3 out of which 2 is the smallest, so 2 is returned.

 

Constraints:

  • 1 <= nums1.length, nums2.length <= 105
  • 1 <= nums1[i], nums2[j] <= 109
  • Both nums1 and nums2 are sorted in non-decreasing order.

代码结果

运行时间: 30 ms, 内存: 36.1 MB


/*
 * 思路:
 * 1. 将nums1和nums2转换为Stream。
 * 2. 使用filter筛选出在两个数组中都存在的元素。
 * 3. 使用findFirst找到最小的公共元素。
 * 4. 如果找到则返回该元素,否则返回-1。
 */

import java.util.Arrays;
import java.util.OptionalInt;
import java.util.stream.IntStream;

public class Solution {
    public int findSmallestCommonElement(int[] nums1, int[] nums2) {
        OptionalInt result = Arrays.stream(nums1)
            .filter(num -> IntStream.of(nums2).anyMatch(n -> n == num))
            .findFirst();
        return result.orElse(-1);
    }
}

解释

方法:

题解的思路是先将其中一个数组(这里是nums2)的元素存储在一个集合中,这样可以利用集合的O(1)时间复杂度的查找特性。然后,遍历另一个数组(nums1),对于每个元素,检查它是否存在于之前创建的集合中。一旦发现第一个公共元素,立即返回该元素。如果遍历完整个数组都没有找到公共元素,则返回-1。

时间复杂度:

O(m + n)

空间复杂度:

O(n)

代码细节讲解

🦆
为什么选择将nums2的元素放入集合中,而不是nums1的元素?这种选择对算法的性能有什么影响?
选择将nums2的元素放入集合中而不是nums1的元素可以基于多种考虑,例如nums2的大小可能比nums1小,这样可以减少内存使用和初始化集合的时间。如果nums2显著小于nums1,将更少的元素放入集合中会更有效率。此外,如果nums1比nums2长,则遍历nums1时的查找操作更频繁,使用较小的集合可以提高查找效率。总的来说,这种选择可以基于输入数组的长度不同来优化性能。
🦆
在创建集合时,对nums2中的重复元素是如何处理的?集合是否自动去重,这对性能有何影响?
在创建集合时,Python的set数据结构会自动去除重复元素。这意味着如果nums2中存在重复值,它们在集合中只会被存储一次。自动去重简化了数据结构,避免了不必要的重复查找,并且减少了存储空间的需求。对性能的影响是正面的,因为它减少了集合的大小,从而提高了查找效率且使用了较少的内存。
🦆
在检查每个元素是否存在于集合中时,如果元素不存在,算法是如何处理的?是否有额外的性能开销?
当在集合中查找一个不存在的元素时,算法简单地继续遍历nums1的下一个元素。集合的查找操作通常是O(1)的时间复杂度,因此,查找不存在的元素的性能开销与查找存在的元素相同。这意味着不存在额外的性能开销,算法的整体效率主要由集合的效率和遍历过程决定。
🦆
这种方法在处理非常大的数据集时(接近上限1e5),性能表现如何?有没有可能出现内存不足的情况?
在处理非常大的数据集时,本方法的性能主要受限于集合的内存使用和查找效率。Python的集合是基于哈希表实现的,因此即使数据量大,平均查找时间仍然是O(1)。然而,如果数据集非常大,特别是接近上限1e5,内存使用会显著增加,尤其是当元素类型占用较多内存或系统资源有限时,可能会遇到内存使用高或内存不足的情况。因此,虽然算法的时间复杂度较低,但在资源限制的环境中应考虑到内存问题。

相关问题