初始化2D数组以进行查询

时间:2018-05-04 17:12:07

标签: python algorithm list multidimensional-array

我有一个2D数组。我必须通过在从左上角到所有点的矩形中标记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(n 2 )。有没有更快的方法来初始化列表?

1 个答案:

答案 0 :(得分:0)

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

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]]

或没有if:

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]