矩阵中的最大和矩形

时间:2016-03-20 17:09:09

标签: algorithm matrix

编写一个函数,该函数采用整数矩阵和矩阵的两个元素,并返回由两个元素组成的矩形中元素的总和。函数必须在O(1)中工作,并且可以根据需要使用额外的内存。我在一次采访中询问了这个问题。我写了很多东西,最终可能会在O(rowxCol)时间内完成。请为(O1)时间提出一些建议!

1 个答案:

答案 0 :(得分:1)

很少我是一名面试官,并且问这些问题我喜欢看候选人如何理解问题,以及基于某些假设他们提供了什么解决方案 - 我决定是否要为他们分配需要思考和分析的任务,或者到目前为止,它们仅适用于猴子编码。

很明显,对于随机矩阵进行涉及k个元素的一些操作,应该至少读取这些元素,这将复杂度的下限设置为O(k)。毫无疑问,毫无疑问。

作为采访者,我等待澄清问题:"可以在建筑物上预处理矩阵吗?" "数据是随机的还是遵循定义的结构?" "操作执行一次或多次,允许O(1)成为聚合复杂度?" 等等。

回到这个特殊问题,如果在同一矩阵上执行O(nm)次操作,我可以提供一个简单的解决方案,获得聚合 O(1):

  1. 创建相同维度的辅助矩阵M',其中每个项M'[i, j]将原始矩阵M中的元素总和存储在[0, 0][i, j]的矩形内{1}}。这种矩阵在O(nm)中重新建立:

    M'[i, j] = get(M', i - 1, j) + get(M', i, j - 1) - get(M', i - 1, j - 1) + M[i, j]

  2. 请求[i1, j1][i2, j2]M之间的矩形总和,可以使用M'轻松计算:

    sumRect(M, i1, j1, i2, j2) = get(M', i2, j2) - get(M', i1 - 1, j2) - get(M', i2, j1 - 1) + get(M', i1 - 1, j1 - 1)

    (此处get(M', i, j)如果M'[i, j]则返回i >= 0 && j >= 0,否则返回0

  3. sumRect因此在O(1)中操作,并且如果它被称为O(nm)次,则操作的总复杂度也是O(1)。额外的内存消耗是O(nm)。