我正在尝试使用最少的运行时间来解决此问题。 如果我们给出了一个2D数组,我们需要返回x,如果存在一个所有值都等于x的行,并且有一个列所有值都等于x。 例如,对于以下2d数组,
0 3 1
2 3 1
1 1 1
我们应该返回1,因为最后一行和最后一列都是相同的值1.如果不存在这样的数字,我们可以返回-1。
我知道有很多方法可以解决这个问题,其中大部分是O(n ^ 2),我想知道是否有一种有效的方法(即O(n))来找到这样的值。 (其中n表示此数组中的单元格数)
答案 0 :(得分:5)
好的,您澄清了您认为O(n)是2D数组中的值的数量。
我将概述伪代码中的方法,您可以将其转换为Java或C ++,无论您喜欢哪种方式。你的问题用两者标记,伪代码很容易直接翻译成C ++或Java。或者Perl。或者Python ......
让我们从第一个简单的步骤开始,如何检查是否存在包含相同值的任何行。这个伪代码是基本的:
你应该能够理解这一点。这是基础的,初级的"计算机科学101"东西。
现在,让我们修改这个伪代码以同时检查列。修改上面的伪代码如下。
top_values
或其大小为m
的内容,即矩阵中的列数。调用第二个flags
,它是一个布尔标志的矢量,它们的大小也是m
。top_values
。也就是说,将matrix[0][x]
复制到top_values[x]
。同时将flags[x]
设置为true
(即使在扫描第0行之前,您也可以将所有flags
初始化为true
,但这并不重要。matrix[y][x]
(其中y是您正在扫描的行#)与top_values[x]
进行比较。如果它们不相同,请将flags[x]
设置为false。flags
向量。如果其中的任何值仍然为真,则矩阵中的列的值相同。你的家庭作业是对上面的伪代码进行轻微调整,以告诉你某个行或列中哪个值相同。