更新:这个答案是假设边不是局部最小值,因为它们不是由原始问题陈述中的四个比较定义的。在这种情况下,这个答案是正确的(不可能)。如果您重新定义问题以使边缘可以是局部最小值,则每个矩阵都至少包含一个局部最小值 - 因此您可以使用分而治之的方法。
如果边缘单元不能是局部最小值:
上述问题没有解决方案。一个 N×N 数组需要 O(N^2) 时间来读取元素。由于矩阵中的任何地方都可能有一个局部最小值“隐藏”,因此可以证明这是必要的。
如果您打算要求 O(N^2) 算法,那么简单地遍历每个元素并将其与其 4 个邻居进行比较需要 O(N^2) 时间。
要么你记错了面试问题(还有更多问题),要么这只是一个微不足道的编码练习。
证明:
1. Construct a NxN matrix such that each cell has the value M[i,j] = N*i + j.
2. Select a random x,y (1 < x < N and 1 < y < N) and assign M[x,y] = -1
该矩阵只有一个局部最小值 (M[x,y]),其位置与其他单元格中的值无关。因此,其他单元格不提供有关其位置的信息,因此不可能有任何系统来搜索它,它的搜索结果优于预期的 (N^2/2) 个单元格 = O(N^2)。
(换句话说,你也可以搜索一个几乎全为零的矩阵 M[i,j] = 0 除了 M[x,y] = -1 的最小值。)
这个证明取决于能否在步骤 1 中构造一个没有局部最小值的矩阵。 如果边缘单元可能是局部最小值,那么每个矩阵都必须有一个,并且这个证明不再成立。