给出一个算法,在n×n矩阵中找到给定元素x(给出坐标),其中行和列单调递增。
我的想法: 减少问题集大小。
在第1列中,找到最大的元素< = x。我们知道x必须在这一行或之后(下)。在矩阵的最后一列中,找到最小的元素> = x。我们知道x必须在此行或之前。对矩阵的第一行和最后一行执行相同的操作。我们现在已经定义了一个子矩阵,如果x完全在矩阵中,它就在这个子矩阵中。现在重复这个子矩阵上的算法......沿着这些方向做点什么。
[YAAQ:又一个阵列问题。]
答案 0 :(得分:5)
我认为你不可能希望超过O(N)
,这是可以实现的。 (N是矩阵的宽度)。
想象一下像这样的矩阵:
0 0 0 0 0 0 ... 0 0 x
0 0 0 0 0 0 ... 0 x 2
0 0 0 0 0 0 ... x 2 2
.....................
0 0 0 0 0 x ... 2 2 2
0 0 0 0 x 2 ... 2 2 2
0 0 0 x 2 2 ... 2 2 2
0 0 x 2 2 2 ... 2 2 2
0 x 2 2 2 2 ... 2 2 2
x 2 2 2 2 2 ... 2 2 2
其中x
是未知数字(不是相同的数字,即每列中可能是不同的数字)。为了满足矩阵的单调性,您可以在所有x
个位置放置0,1或2中的任何一个。因此,要查找矩阵中是否有1,您必须检查所有x
个地方,并且其中有N个。
O(n)
想象一下,您必须为所有行找到number > q
(给定数字)的第一列标记。你从矩阵的右上角开始;如果你看到的数字更大,你就走了;否则就下去了。当你在最后一行时结束。你去的地方是你搜索的地方。如果他们中的任何一个有你搜索的号码,你就找到了它。
此算法为O(n)
,因为在每个步骤中,您可以向左或向下移动。完全不能超过N
次,N
次。因此它是O(n)
。
答案 1 :(得分:2)
选择一个角元素,一个在行中最大,在列中最小(或另一个)。与x比较。根据比较结果,您可以从进一步搜索中排除行或列。
与原始矩阵相比,新矩阵的尺寸总和减少了1。迭代地应用上面的内容。在2*n
步后,您最终得到1x1
矩阵。
答案 2 :(得分:-1)
如果“行和列单调增加”意味着每个(行,列)中的值增加,使得对于任何行,(rowM,col1)< (rowM,col2)< ......< (rowM,colN)< (rowM + 1,col1)...
然后你可以把它当作一个从最小到最大排序的一维数组,然后通过从开始时采样1/2(行* cols)的项目进行标准二进制搜索,然后对后面是1/4(行* cols)的元素(如果采样的第一个元素是> x)或者前面(如果采样的第一个元素是< x),等等。