编写一个函数,该函数采用整数矩阵和矩阵的两个元素,并返回由两个元素组成的矩形中元素的总和。函数必须在O(1)中工作,并且可以根据需要使用额外的内存。我在一次采访中询问了这个问题。我写了很多东西,最终可能会在O(rowxCol)时间内完成。请为(O1)时间提出一些建议!
答案 0 :(得分:1)
很少我是一名面试官,并且问这些问题我喜欢看候选人如何理解问题,以及基于某些假设他们提供了什么解决方案 - 我决定是否要为他们分配需要思考和分析的任务,或者到目前为止,它们仅适用于猴子编码。
很明显,对于随机矩阵进行涉及k个元素的一些操作,应该至少读取这些元素,这将复杂度的下限设置为O(k)。毫无疑问,毫无疑问。作为采访者,我等待澄清问题:"可以在建筑物上预处理矩阵吗?" ,"数据是随机的还是遵循定义的结构?" ,"操作执行一次或多次,允许O(1)成为聚合复杂度?" 等等。
回到这个特殊问题,如果在同一矩阵上执行O(nm)次操作,我可以提供一个简单的解决方案,获得聚合 O(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]
请求[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
sumRect
因此在O(1)中操作,并且如果它被称为O(nm)次,则操作的总复杂度也是O(1)。额外的内存消耗是O(nm)。