在长度为n的二进制圆形数组中,查找是否可以对其进行分区,使得大小为m的相邻元素的大多数组具有多于0的1。

时间:2017-02-12 16:12:26

标签: arrays algorithm

例如,如果是数组 001101100 存在分区 011 011 000 其中最大组的数量大于0。 然而,在 100110100 没有。 我尝试过蛮力的方法,需要花费O(n ^ 3)的时间。请提出一种更有效的方法,因为这不起作用。

1 个答案:

答案 0 :(得分:0)

有一个O(n)时间算法可以重用组和。我假设“大多数”意味着多数而不是最大化,但改变并不难。

def circular(array, m):
    n = len(array)
    assert n % 2 == 1
    assert m % 2 == 1
    assert n % m == 0
    groupsums = [sum(array[j * m:(j + 1) * m]) for j in range(n // m)]
    for i in range(m):
        if sum(groupsum > m // 2 for groupsum in groupsums) > (n // m) // 2:
            return [[array[(j * m + k) % n] for k in range(i, i + m)]
                    for j in range(n // m)]
        for j in range(n // m):
            groupsums[j] -= array[(j * m + i) % n]
            groupsums[j] += array[((j + 1) * m + i) % n]


print(circular([0, 0, 1, 1, 0, 1, 1, 0, 0], 3))
print(circular([1, 0, 0, 1, 1, 0, 1, 0, 0], 3))
print(circular([0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1], 3))