Java Program to Find Common Elements in All Rows of a Given Matrix

2025年5月2日 | 阅读 4 分钟

问题描述

给你一个由“m”行和“n”列组成的矩阵。目的是识别矩阵所有行中的公共元素。解决方案应能有效地返回这些公共元素,并考虑时间和空间复杂度。

方法

为了解决这个问题,我们使用基于哈希的解决方案。我们维护一个哈希表(或哈希表)来跟踪元素在行中的出现频率。算法包括以下步骤:

  1. 初始化:创建一个 'HashMap<Integer, Integer>' 来保存条目及其计数。键是元素,值是它出现的行数。
  2. 处理第一行:遍历矩阵的第一行,并将每个元素存储在哈希映射中,计数为 1。
  3. 处理后续行:对于每一后续行,仅当元素已存在于哈希映射中并且在前所有行中出现过时,才更新其计数。
    如果元素在当前行中找不到,则将其从映射中删除,从而确保在处理结束时只剩下公共元素。
  4. 最终检查:最后,遍历哈希映射以查找计数与行数匹配的元素。这些就是公共元素。

文件名:CommonElementsMatrix.java

输出

 
Common elements in all rows: [1,8]   

解释

Java 代码首先定义了 findCommonElements() 函数,该函数接受一个二维整数 数组(矩阵)作为输入。首先,代码检查矩阵是否为空或为 null 以处理边缘情况。初始化一个哈希映射(map)来跟踪矩阵行中元素的频率。

第一行的元素以初始计数 1 添加到映射中。对于每一后续行,代码仅使用临时映射(TempMap)更新先前所有行中存在的元素的计数。如果元素的计数与行索引匹配,则表示该元素在此之前的行中都存在。

最后,将计数等于总行数的元素视为公共元素并添加到结果列表中。

复杂度分析

第一行的哈希映射初始化需要 O(n) 时间,其中 n 是列数。处理行需要 O(m*n) 时间,其中 m 是行数,因为矩阵中的每个元素都会被检查一次。最后收集公共元素需要 O(k) 时间,其中 k 是公共元素的数量。

因此,整体时间复杂度为 O(m*n)。

空间复杂度分析

用于在哈希映射中存储元素的空间在最坏情况下为 O(n)(如果第一行中的所有元素都是唯一的)。用于在行处理期间存储临时结果的附加空间。因此,空间复杂度为 O(n)。

在提供的示例中,1 和 8 是唯一出现在矩阵所有行中的元素。该算法通过逐行更新计数并过滤掉非公共元素来有效地识别 1 和 8。

该方法的优点

  • 效率:该算法通过仅更新相关元素的计数来避免冗余检查。
  • 简洁性:它使用 HashMap 等基本数据结构,使实现变得简单。
  • 可扩展性:由于它对每一行进行线性处理,因此可以很好地处理更大的矩阵。

替代方法

  1. 基于排序的方法:可以对每一行进行排序,并实现使用二分查找的公共元素搜索。但是,这会将复杂度增加到 O(m*n log n)。
  2. 基于集合的方法:为每一行使用 HashSet,并迭代地计算交集。复杂度与基于哈希的方法类似,但可能需要额外的空间来存储多个集合。

结论

本代码中使用的基于哈希的方法是在矩阵行中查找公共元素的最佳方法,在简洁性和效率之间取得了平衡。


下一主题Java 图