最小化 0/1 数组中的最大连续子数组
minimize the maximum continious subarray in array of 0/1
算法题
给定
的 0/1 的二进制数组
在一次操作中,我可以翻转数组的任何数组[索引],即 0->1 或 1->0
所以目标是通过使用最多 k 个翻转来最小化连续 1 或 0 的最大长度
例如,如果 11111 if array 和 k=1 ,最好将 array 设置为 11011
并且最大连续1或0的最小值为2
对于 111110111111 和 k=3 ans 是 2
我尝试了 Brute Force(通过尝试各种位置翻转)但效率不高
我觉得贪心,但想不通
你能帮我做算法吗,O(n) 或类似的
可以通过按顺序读取每个位并将每个连续的 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 的大小。每当这样做需要 <= k 时,我们就会得到我们正在寻找的结果,因为 i 从 1 开始上升。 (即,当我们发现 flips_needed <= k 时,我们知道 1 的组已尽可能少)
算法题
给定
的 0/1 的二进制数组
在一次操作中,我可以翻转数组的任何数组[索引],即 0->1 或 1->0
所以目标是通过使用最多 k 个翻转来最小化连续 1 或 0 的最大长度
例如,如果 11111 if array 和 k=1 ,最好将 array 设置为 11011
并且最大连续1或0的最小值为2
对于 111110111111 和 k=3 ans 是 2
我尝试了 Brute Force(通过尝试各种位置翻转)但效率不高
我觉得贪心,但想不通
你能帮我做算法吗,O(n) 或类似的
可以通过按顺序读取每个位并将每个连续的 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 的大小。每当这样做需要 <= k 时,我们就会得到我们正在寻找的结果,因为 i 从 1 开始上升。 (即,当我们发现 flips_needed <= k 时,我们知道 1 的组已尽可能少)