如何解决有人能告诉我解决这个 zigag 遍历问题的时间复杂度吗
zigzag 遍历
这是来自 algoexpert 的问题之一,这是我涉及数学的解决方案
def zigzagTraversal(arr):
out = []
test = 1
out.append(arr[0][0])
while test <= len(arr)+len(arr[0]):
for j in range(len(arr[0])):
for i in range(len(arr)):
if test % 2 == 1:
if i + j == test:
# print(arr[i][j])
out.append(arr[i][j])
else:
if i + j == test:
out.append(arr[j][i])
test += 1
return out
print(zigzagTraversal([[1,3,4,10],[2,5,9,11],[6,8,12,15],[7,13,14,16]]))
解决方法
让N=len(arr),M=len(arr[0])
。此代码具有 O(NM^2+N^2M)
复杂度(或 O(N^3)
用于方形输入矩阵)。原因如下:外循环 (while
) 完全等同于 for
循环(因为您在最后增加 test
并且永远不会在其他地方更改它)并且将被执行 N+M
次.然后您进入第二个循环,该循环正好执行 N
次。然后内循环 - M
次。中间循环的每一步都会重复内循环,与外循环相同。因此,我们必须将所有这些计数相乘。当然,所有内部操作都不是原子的,但对于小数据,平均而言将是 O(1)
。如果您的输入很大,我建议预先分配 out
(将其创建为 out = [None for _ in range(N*M)]
)以避免其增长成本,并将当前第一个免费索引作为附加变量。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。