【问题标题】:Initializing a 2D array for enquiries初始化二维数组以进行查询
【发布时间】:2018-10-15 05:49:46
【问题描述】:

我有一个二维数组。我必须通过在从左上角到所有点的矩形中标记 1 的数量来初始化数组。

原始二维数组:

[0, 1, 0, 0, 0, 1, 0]
[1, 1, 0, 0, 1, 0, 1]
[0, 1, 1, 0, 1, 0, 0]
[0, 0, 0, 0, 0, 0, 1]

第一步(将垂直元素与上一步相加):

[0, 1, 1, 1, 1, 2, 2]
[1, 2, 2, 2, 3, 3, 4]
[0, 1, 2, 2, 3, 3, 3]
[0, 0, 0, 0, 0, 0, 1]

第二步(将水平元素与上一步相加):

[0, 1, 1, 1, 1, 2, 2]
[1, 3, 3, 3, 4, 5, 6]
[1, 4, 5, 5, 7, 8, 9]
[1, 4, 5, 5, 7, 8, 10]

这两个操作都是 O(n2)。有没有更快的方法来初始化列表?

【问题讨论】:

  • 你想创建一个大小为 n^2 的列表,填充它的复杂度不会低于 O(n^2)

标签: python algorithm list multidimensional-array


【解决方案1】:

你无法避免二次时间,但没有必要分两步
(好的,正确答案的代码看起来更长一点:))

lst=[[0, 1, 0, 0, 0, 1, 0]]
lst.append([1, 1, 0, 0, 1, 0, 1])
lst.append([0, 1, 1, 0, 1, 0, 0])
lst.append([0, 0, 0, 0, 0, 0, 1])
for i in range(1.len(lst)):
    for j in range(len(lst[0])):
        if (i>0):
            lst[i][j] += lst[i-1][j]
        if (j>0):
            lst[i][j] += lst[i][j-1]
        if (i>0) & (j>0):
            lst[i][j] -= lst[i-1][j-1]

print(lst)

>>>[[0, 1, 1, 1, 1, 2, 2], 
    [1, 3, 3, 3, 4, 5, 6], 
    [1, 4, 5, 5, 7, 8, 9], 
    [1, 4, 5, 5, 7, 8, 10]]

或者没有如果:

for j in range(1,len(lst[0])):
    lst[0][j] += lst[0][j-1]
for i in range(1,len(lst)):
    lst[i][0] += lst[i-1][0]
for i in range(1,len(lst)):
     for j in range(1,len(lst[0])):
        lst[i][j] = lst[i][j] + lst[i-1][j] + lst[i][j-1] - lst[i-1][j-1]

【讨论】:

  • @martineau 这样使用if 有效吗?
  • @Kurns 我错过了减法部分。已添加。
猜你喜欢
  • 2012-11-29
  • 2012-05-20
  • 1970-01-01
  • 2016-05-10
  • 2021-02-22
  • 2011-12-08
相关资源
最近更新 更多