查找必须设置位以最大化下一个设置位之间距离的索引
给定一个数组,其中只包含二进制数字“0”和“1”。我们必须对给定数组进行一位设置,该位之前不是设置位(给定数组中将至少存在一个位不是设置位),将其设置为位,以便最终数组中设置位之间存在的索引数将达到最大可能的距离。
示例
输入
int arr[] = {1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1}
输出
3
说明:如果我们在索引 3 处翻转位,我们将从索引 0 和索引 6 获得 3 的距离。对于所有其他索引,距离小于 3。
输入
int arr[] = {0, 0, 0, 1, 0, 0, 1}
输出
3
说明:我们可以翻转索引零处的位,并将获得 3 的距离,对于其他可能的索引,例如索引 1 的 2 和索引 2、4 和 5 的 1。
方法
我们已经看到了上面关于问题的解释和示例,现在让我们转到实现代码所需的步骤
首先,我们将创建一个函数,其中我们将数组和数组的长度作为参数传递,它将返回一个整数。
我们将创建两个指针,一个将是慢指针,最初为 -1,并且始终指示我们找到的最后一个设置位。
快指针将遍历数组,每次增加 1。
在每个设置位上,我们将检查慢指针是否为 -1,因为如果慢指针为 -1 表示我们可以设置索引 0 的位,否则我们需要设置中间索引的位。
在每个设置位上,我们将检查中间值并在需要时更新答案,我们还将慢指针的位置更新到当前索引。
在循环结束时,我们将检查最后一个索引处的设置位可能性,并在可能时更新答案的值。
示例
#include <bits/stdc++.h> using namespace std; // function to find the required maximum distance we will change only 1 bit from it int findDis(int arr[], int len){ int slow = -1, fast = 0; int ans = 0; // variable to store the answer // iterating over the array using the pointers and while loop while(fast < len ){ // if the current index value is 1 if(arr[fast] == 1){ // if the slow pointer is at -1 means we hit the first index that contains 1 and now we can flip the value at the zeroth index if(slow == -1 ){ // if fast is set bit we cannot flip a zero here if(fast == 0){ slow = fast; fast++; // moving to the next index continue; } ans = max(ans, fast - slow); slow = fast; } else{ // in this case we will always flip the middle index value ans = max(ans, (fast-slow+1)/2); slow = fast; // increasing slow pointer to current pointer } } fast++; // moving to the next index } // now check if we can flip the last index ans = max(ans, len -1 -slow); return ans;// returning the final answer } int main(){ int arr[] = {1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1}; // given array // getting the size of the array int len = sizeof(arr)/ sizeof(arr[0]); cout << "The maximum distance at which we can mark the set bit is " << findDis(arr, len) << endl; return 0; }
输出
The maximum distance at which we can mark the set bit is 3
时间和空间复杂度
上述代码的时间复杂度为 O(N),其中 N 是给定数组的大小。我们只遍历数组一次,使得时间复杂度为线性。
在此程序中,我们没有使用任何额外的空间,这使得上述代码的时间复杂度为 O(1) 或常数。
注意:给定的初始数组中将至少存在一个设置位,否则获取任意两个设置位之间的距离将没有任何意义。
结论
在本教程中,我们实现了一个程序来查找我们创建的一个设置位之间两个设置位之间的最大距离。我们使用了双指针方法通过 while 循环遍历数组并将答案存储在一个变量中。上述代码的时间复杂度为 O(N),因为我们只遍历了数组一次,并且没有消耗额外的空间。