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)或类似的
答案 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组是最小的)