이 문제에서는 0 또는 1인 n개의 요소로 구성된 배열 arr이 제공됩니다. 우리의 임무는 이웃 채우기의 최소 반복을 사용하여 배열을 1로 채우는 것입니다.
문제를 이해하기 위해 예를 들어 보겠습니다.
입력: arr[] ={0, 1, 1, 0, 0, 1}
출력: 1
해결 방법 -
문제를 해결하려면 위치에 1이 있으면 인접한 두 개의 0을 1로 변환할 수 있다는 사실을 알아야 합니다.
만약, arr[i]는 1이다.
그러면 arr[i-1]과 arr[i+1]이 1로 변환됩니다.
이를 사용하여 다음 경우 중 하나를 사용하여 솔루션을 찾을 수 있습니다.
사례 1: 블록은 블록의 시작과 끝이 1입니다. 나머지 값은 모두 0입니다. 0의 개수를 센다.
반복 횟수 =zeroCount / 카운트가 짝수인 경우 2
반복 횟수 =(zeroCount -1)/카운트가 홀수인 경우 2
사례 2: 블록은 블록의 시작 또는 끝에서 단일 1을 가지며 나머지 값은 모두 0입니다.
반복 횟수 =zeroCount
사례 3: 블록에는 1이 없습니다. 1을 채울 수 없음을 나타내는 -1을 인쇄합니다.
우리 솔루션의 작동을 설명하는 프로그램,
예시
#include<iostream>
using namespace std;
int countIterationFill1(int arr[], int n) {
bool oneFound = false;
int iterationCount = 0;
for (int i=0; i<n; ) {
if (arr[i] == 1)
oneFound = true;
while (i<n && arr[i]==1)
i++;
int zeroCount = 0;
while (i<n && arr[i]==0) {
zeroCount++;
i++;
}
if (oneFound == false && i == n)
return -1;
int itrCount;
if (i < n && oneFound == true) {
if (zeroCount & 1 == 0)
itrCount = zeroCount/2;
else
itrCount = (zeroCount+1)/2;
zeroCount = 0;
}
else{
itrCount = zeroCount;
zeroCount = 0;
}
iterationCount = max(iterationCount, itrCount);
}
return iterationCount;
}
int main() {
int arr[] = {0, 1, 1, 0, 0, 1, 0, 0, 0, 1};
int n = sizeof(arr) / sizeof(arr[0]);
cout<<"The number of iterations to fill 1's is "<<countIterationFill1(arr, n);
return 0;
} 출력 -
The number of iterations to fill 1's is 2