最小化0/1数组中的最大连续子阵列

时间:2017-03-09 08:50:09

标签: greedy

Algo问题

 二进制数组0/1给出
在一个操作中,我可以翻转阵列的任何阵列[索引],即0-> 1或1-> 0 所以目的是通过使用最多k翻转来最小化连续1或0的最大长度

例如,如果11111如果数组和k = 1,最好是将数组作为11011
最大连续1或0的最小值为2

对于111110111111和k = 3 ans是2

我尝试了蛮力(通过尝试各种位置翻转),但效率不高。
我认为贪婪,但无法弄明白  你可以帮我找algo, O(n)或类似的

1 个答案:

答案 0 :(得分:0)

可以通过按顺序读取每个位并将每个连续组1的大小记录到列表A中来设计解决方案。

完成填充A后,您可以按照以下伪代码描述的算法:

result = N
for i = 1 to N
    flips_needed = 0
    for a in A:
        flips_needed += <number of flips needed to make sure largest group remaining in a is of size i>
    if k >= flips_needed:
        result = flips_needed
        break
return result

N是整个初始序列中的位数。

上述算法的工作原理是将1组分成最多i的大小。每当这样做需要&lt; = k时,我们就会得到我们正在寻找的结果,因为我从1开始然后上升。 (即当我们发现flips_needed&lt; = k时,我们知道1组是最小的)