Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 연속 1의 수가 최대화되도록 뒤집을 0 찾기

<시간/>

이 튜토리얼에서는 배열에서 연속 1의 최대 수를 얻기 위해 뒤집어야 하는 0의 수를 찾을 것입니다.

우리는 문제를 해결하기 위해 슬라이딩 윈도우 접근 방식을 사용할 것입니다. 문제를 해결하는 단계를 살펴보겠습니다.

  • 뒤집을 배열과 최대 0을 초기화합니다.

  • 길이에 따라 창 시작, 끝 인덱스를 초기화합니다.

  • 연속된 1의 길이와 시작 인덱스의 최대 하위 배열을 저장합니다.

  • 끝 인덱스가 배열 길이와 교차할 때까지 배열을 반복합니다.

  • 0 수가 최대 0 수보다 작으면 끝 인덱스를 증가시키고 현재 값이 0이면 0을 계산합니다.

  • 0 개수가 최대 0 개수보다 크면 시작 인덱스를 증가시키고 현재 값이 0이면 0 개수를 줄입니다.

  • 현재 창 길이가 이전 창 길이보다 큰 경우 최대 창을 업데이트합니다.

  • 배열을 반복하고 창 시작 인덱스를 사용하여 0 인덱스를 인쇄합니다.

예시

코드를 봅시다.

#include <bits/stdc++.h>
using namespace std;
void zeroesIndexes(int arr[], int maxZeroes, int n) {
   int start = 0, end = 0;
   int zeroesCount = 0;
   int bestWindowCount = 0, bestWindowStartIndex = 0;
   while (end < n) {
      if (zeroesCount <= maxZeroes) {
         if (arr[end] == 0) {
            zeroesCount++;
         }
         end++;
      }
      if (zeroesCount > maxZeroes) {
         if (arr[start] == 0) {
            zeroesCount--;
         }
         start++;
      }
      if ((end - start > bestWindowCount) && (zeroesCount <= maxZeroes)) {
         bestWindowCount = end - start;
         bestWindowStartIndex = start;
      }
   }
   cout << "The indexes are ";
   for (int i = 0; i < bestWindowCount; ++i) {
      if(arr[bestWindowStartIndex + i] == 0)
         cout << bestWindowStartIndex + i << " ";
   }
}
int main() {
   int arr[] = {1, 0, 0, 1, 1, 0, 1, 0, 1, 1};
   int maxZeroes= 2;
   zeroesIndexes(arr, maxZeroes, 10);
   return 0;
}

출력

위의 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

The indexes are 5 7

결론

튜토리얼에서 질문이 있는 경우 댓글 섹션에 언급하세요.