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