二进制数组是一种特殊类型的数组,只包含数字0和1。在这个问题中,我们给出了一个二进制数组和一个整数K。我们的任务是计算在给定的二进制数组中,可以将最大数量的0翻转为1,使得两个1之间至少有K个0。
示例示例
Input 1: arr[] = { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 }, K = 2
登录后复制
Output 1: yes
登录后复制
Explanation
的中文翻译为:
解释
上述数组中的第3个和第6个索引是唯一有效的索引,可以翻转,以确保两个1之间至少有2个0。因此,结果数组是{1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0}
Input 2: arr[] = {0, 1, 0, 0, 0, 1}, k = 1
登录后复制
Output 2: 1
登录后复制
Explanation
的中文翻译为:
解释
以上数组的第3个索引是唯一有效的翻转索引。
Approach
我们已经看到了上面给出的数组和整数k的示例,让我们继续讨论方法−
这种方法的思想是计算两个1之间连续的0的个数,并检查是否适合在它们之间翻转一些0为1。假设两个1之间有X个0。根据观察,可以翻转的0的个数为(X-K) / (K+1)。因此,遍历数组并记录每对1之间有多少个连续的0。然后,将可以翻转的0的个数添加到变量count中,这是所需的响应。
让我们逐步讨论下面的方法-
-
首先,我们将创建一个名为‘onesCount’的函数,该函数将以给定的数组‘arr’和整数‘K’作为参数,并将所需的整数‘count’作为返回值返回。
-
创建变量 count 和 lastIdx。
-
使用0初始化变量count,用于存储fillip 0s的计数。
-
使用(-(K+1))初始化变量lastIdx,以存储数组中值为1的最后一个索引。
-
使用for循环遍历数组,检查当前元素是否为1,然后验证两个连续的1之间是否有足够的0来添加另一个1。最后,更新最后一个1的索引值。
-
编写计算数组中最后一段0的条件,并将其添加到变量count中。
-
最后,返回我们的最终答案计数。
Example
的中文翻译为:
示例
下面是一个用于计算最大化0s转换为1s的C++程序,以确保在两个1之间至少存在k个0。
#include
using namespace std;
// Function to find the count of the maximum number of 0s to be filliped
int onesCount(int arr[], int n, int k){
int count = 0; // Stores the count of 1's
int lastIdx = -(k + 1); // Stores the last index of value 1
// Traverse the array using for loop
for (int i = 0; i = 2 * (k - 1)) {
count += (i - lastIdx - 1 - k) / (k + 1);
}
lastIdx = i; // Update the last index of the value 1 of the array
}
}
// condition to include the last section of 0s in the array
count += (n - lastIdx - 1) / (k + 1);
// Return the answer
return count;
}
int main(){
int arr[] = { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 }; // given array
int N = sizeof(arr) / sizeof(arr[0]); //getting size of an array
int K = 2; //given integer
// Call the function
int result = onesCount(arr, N, K);
cout