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

时间:2016-05-01 01:43:38

标签: java c++

我正在尝试使用最少的运行时间来解决此问题。 如果我们给出了一个2D数组,我们需要返回x,如果存在一个所有值都等于x的行,并且有一个列所有值都等于x。 例如,对于以下2d数组,

  

0 3 1

     

2 3 1

     

1 1 1

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

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

1 个答案:

答案 0 :(得分:5)

好的,您澄清了您认为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向量。如果其中的任何值仍然为真,则矩阵中的列的值相同。

你的家庭作业是对上面的伪代码进行轻微调整,以告诉你某个行或列中哪个值相同。