最小公共值

标签: 数组 哈希表 双指针 二分查找

难度: Easy

给你两个整数数组 nums1 和 nums2 ,它们已经按非降序排序,请你返回两个数组的 最小公共整数 。如果两个数组 nums1 和 nums2 没有公共整数,请你返回 -1 。

如果一个整数在两个数组中都 至少出现一次 ,那么这个整数是数组 nums1 和 nums2 公共 的。

示例 1:

输入:nums1 = [1,2,3], nums2 = [2,4]
输出:2
解释:两个数组的最小公共元素是 2 ,所以我们返回 2 。

示例 2:

输入:nums1 = [1,2,3,6], nums2 = [2,3,4,5]
输出:2
解释:两个数组中的公共元素是 2 和 3 ,2 是较小值,所以返回 2 。

提示:

  • 1 <= nums1.length, nums2.length <= 105
  • 1 <= nums1[i], nums2[j] <= 109
  • nums1 和 nums2 都是 非降序 的。

Submission

运行时间: 30 ms

内存: 36.1 MB

class Solution:
    def getCommon(self, nums1: List[int], nums2: List[int]) -> int:
        # numsT = set(nums1).intersection(set(nums2))
        # return min(set(nums1).intersection(set(nums2))) if set(nums1).intersection(set(nums2)) else -1

        save = set(nums2)
        for i in nums1:
            if i in save:
                return i 
        return -1

Explain

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

时间复杂度: O(m + n)

空间复杂度: O(n)

# 定义Solution类

class Solution:
    def getCommon(self, nums1: List[int], nums2: List[int]) -> int:
        # 创建一个集合存储nums2的所有元素
        save = set(nums2)
        # 遍历nums1中的每个元素
        for i in nums1:
            # 检查元素是否在nums2的集合中
            if i in save:
                return i  # 返回第一个找到的公共元素
        return -1  # 如果没有找到公共元素,返回-1

Explore

选择将nums2的元素放入集合中而不是nums1的元素可以基于多种考虑,例如nums2的大小可能比nums1小,这样可以减少内存使用和初始化集合的时间。如果nums2显著小于nums1,将更少的元素放入集合中会更有效率。此外,如果nums1比nums2长,则遍历nums1时的查找操作更频繁,使用较小的集合可以提高查找效率。总的来说,这种选择可以基于输入数组的长度不同来优化性能。

在创建集合时,Python的set数据结构会自动去除重复元素。这意味着如果nums2中存在重复值,它们在集合中只会被存储一次。自动去重简化了数据结构,避免了不必要的重复查找,并且减少了存储空间的需求。对性能的影响是正面的,因为它减少了集合的大小,从而提高了查找效率且使用了较少的内存。

当在集合中查找一个不存在的元素时,算法简单地继续遍历nums1的下一个元素。集合的查找操作通常是O(1)的时间复杂度,因此,查找不存在的元素的性能开销与查找存在的元素相同。这意味着不存在额外的性能开销,算法的整体效率主要由集合的效率和遍历过程决定。

在处理非常大的数据集时,本方法的性能主要受限于集合的内存使用和查找效率。Python的集合是基于哈希表实现的,因此即使数据量大,平均查找时间仍然是O(1)。然而,如果数据集非常大,特别是接近上限1e5,内存使用会显著增加,尤其是当元素类型占用较多内存或系统资源有限时,可能会遇到内存使用高或内存不足的情况。因此,虽然算法的时间复杂度较低,但在资源限制的环境中应考虑到内存问题。