有效的算法来检查是否存在具有相同值的行和列

efficient algorithm to check if there exists a row and a column with same values?

本文关键字:算法 检查 是否 存在 有效      更新时间:2023-10-16

我正试图用最少的运行时间来解决这个问题。如果给我们一个2D数组,我们需要返回x,如果存在一行所有值都等于x,而存在一列所有值都相等x。例如,对于下面的2d阵列,

0 3 1

2 3 1

1 1 1

我们应该返回1,因为最后一行和最后一列都是相同的值1。如果不存在这样的数字,我们可以返回-1。

我知道有很多方法可以解决这个问题,其中大多数都是O(n^2),我想知道是否有一种有效的方法(即O(n))可以找到这样的值。(其中n表示此阵列中的单元数)

好的,您澄清了您认为O(n)是2D数组中的值的数量。

我将在伪代码中概述这种方法,您可以将其翻译成Java或C++,无论您喜欢哪种。您的问题同时带有这两个标记,并且伪代码非常琐碎,可以直接翻译成C++或Java。或者Perl。或者Python。。。

第1部分

让我们从第一个简单的步骤开始,即如何检查是否有包含相同值的行。这方面的伪代码是基本的:

  • 从第0行开始,n=0
  • 检查矩阵[n][0]到[n][m-1](其中m是矩阵中的列数)是否包含相同的值。如果是的话,你找到了
  • 否则,递增n,转到下一行,直到到达矩阵的底部

你应该能够理解这一点。这是"计算机科学101"的基本内容。

第2部分

现在,让我们修改这个伪代码,以便同时检查列。按如下方式修改上面的伪代码。

  • 创建两个一维向量,将第一个向量称为top_values,或其他大小为m的向量,即矩阵中的列数。调用第二个flags,它是布尔标志的向量,它们的大小也是m
  • 扫描第0行时,在第一部分中给出的伪代码中,将第0行的值复制到top_values中。也就是说,将matrix[0][x]复制到top_values[x]中。还可以将flags[x]设置为true(即使在扫描第0行之前,也可以将所有flags初始化为true,这无关紧要)
  • 当您使用第1部分中给出的伪代码扫描剩下的每一行时,将matrix[y][x](其中y是您正在扫描的行#)与top_values[x]进行比较。如果它们不相同,请将flags[x]设置为false
  • 在第1部分伪代码的末尾,检查flags向量。如果其中的任何值仍然为真,那么矩阵中有一列的值是相同的

你的家庭作业是对上面的伪代码做一个小小的调整,告诉你在某行或某列中哪个值是相同的。