【发布时间】:2012-05-22 07:54:40
【问题描述】:
假设我有一个矩阵 (MxN),它的行和列已排序。
- 每行中的所有元素都按升序排列
- 每列中的所有元素都按升序排列
- 所有元素都是整数
-
无法做出其他假设
示例:
[1 5 8 20]
[2 9 19 21]
[12 15 25 30]
我必须找出给定的数字是否存在于矩阵中(基本搜索)。我有一个运行 O(n)
int row = 0;
int col = N-1;
while (row < M && col >= 0) {
if (mat[row][col] == elem) {
return true;
} else if (mat[row][col] > elem) {
col--;
} else {
row++;
}
}
但有人问我O(log (MxN)) == O(Log(n)) 解决方案。有什么想法吗??
【问题讨论】:
-
除了排序之外,你对矩阵的输入有什么了解(比如它的行/列大小,perhpas?)
-
@Yoel:嗯,它可以很大,只有整数,可以有负数。有什么具体要找的吗?
-
每行的第一个元素是否保证大于上一行的最后一个元素? (如您的示例所示)在这种情况下,修改后的二进制搜索问题很简单
-
@BrokenGlass:不,这根本不能保证。唯一的条件是行按升序排序,列也是如此。
-
@phix23:我不确定。其实没想到。但是如果
n = MxN将其视为一个数组,您将如何进行搜索?
标签: performance algorithm