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

C++의 이진 배열에서 0과 1로만 구성된 하위 배열의 수를 센다.

<시간/>

0과 1만 포함하는 배열 arr[]이 제공됩니다. 목표는 각 하위 배열에 0만 포함하거나 둘 다 포함하지 않는 1만 포함하도록 arr[]의 모든 하위 배열을 계산하는 것입니다. 배열이 [1,0,0]인 경우 하위 배열은 0의 경우에만 [0], [0], [0,0]이고 1의 경우에만 [1]입니다.

예를 들어 이해합시다.

입력 - arr[] ={ 0, 0, 1, 1, 1, 0 };

출력 − 0만 있는 하위 배열:4 1만 있는 하위 배열:6

설명 − Subaarays는 −

For all 0’s: [0], [0], [0], [0,0]. Total 4 ( arr[0], arr[1], arr[5], arr[0-1] )
For all 1’s: [1], [1], [1], [1,1], [1,1], [1,1,1]. Total 6 ( arr[2], arr[2], arr[4], arr[2-3], arr[3-4],
arr[2-4] )

입력 - arr[] ={ 1,0,1,0 };

출력 − 0만 있는 하위 배열:2 1만 있는 하위 배열:2

설명 − Subaarays는 −

For all 0’s: [0], [0]. Total 2 ( arr[1], arr[3] )
For all 1’s: [1], [1]. Total 2 ( arr[0], arr[2] )

아래 프로그램에서 사용한 접근 방식은 다음과 같습니다.

0과 1만 있는 하위 배열을 별도로 계산하기 위해 배열을 두 번 탐색합니다. 두 개의 카운터 count_0 및 count_1을 사용하여 배열에 연속 0과 1의 개수를 저장합니다. 이러한 각 개수에 대해 가능한 하위 배열은 count_0*(count_0+1)/2이고 count_1의 경우에도 유사합니다.

배열의 끝에 도달할 때까지 total_0 count에 이것을 추가합니다. 1에 대해 유사한 과정을 수행합니다.

  • 숫자의 배열 arr[]를 가져옵니다.

  • sub_zero_one(int arr[], int size) 함수는 배열을 받아 0만 있는 하위 배열의 개수와 1만 있는 하위 배열의 개수를 반환합니다.

  • 하위 배열의 경우 초기 개수를 temp_0 및 ​​temp_1로 사용합니다.

  • 0과 1의 임시 연속 카운트를 count_0 및 count_1로 취합니다.

  • for 루프를 사용하여 i=0에서 I 까지 배열을 탐색합니다.

  • 현재 요소가 0이면 count_0을 증가시킵니다.

  • 그렇지 않은 경우 count_0이 0인 모든 가능한 하위 배열을 temp_one_0=count*(count+1)/2로 계산합니다.

  • 지금까지 모두 0이 발견된 하위 배열에 대해 이전 temp_0에 이것을 추가합니다.

  • count_1, temp_one_1 및 temp_1과 같은 변수를 사용하여 for 루프를 사용하여 유사한 프로세스를 수행합니다.

  • 두 탐색이 모두 끝나면 temp_0과 temp_1은 모두 0과 모두 1을 갖는 arr 내의 모든 하위 배열에 대한 각각의 카운트를 갖습니다.

예시

#include <bits/stdc++.h>
using namespace std;
void sub_zero_one(int arr[], int size){
   int count_1 = 0;
   int count_0 = 0;
   int temp_1 = 0;
   int temp_0 = 0;
   for (int i = 0; i < size; i++){
      if (arr[i] == 1){
         count_1++;
      }
      else{
         int temp_one_1 = (count_1) * (count_1 + 1) / 2;
         temp_1 = temp_1 + temp_one_1;
         count_1 = 0;
      }
   }
   for (int i = 0; i < size; i++){
      if (arr[i] == 0)
         { count_0++; }
      else{
         int temp_one_0 = (count_0) * (count_0 + 1) / 2;
         temp_0 = temp_0 + temp_one_0;
         count_0 = 0;
      }
   }
   if (count_1){
      int temp_one_1 = (count_1) * (count_1 + 1) / 2;
      temp_1 = temp_1 + temp_one_1;
   }
   if (count_0){
      int temp_one_0 = (count_0) * (count_0 + 1) / 2;
      temp_0 = temp_0 + temp_one_0;
   }
   cout<<"Subarrays with only 0's are : "<<temp_0;
   cout<<"\nSubarrays with only 1's are : "<<temp_1;
}
int main(){
   int arr[] = { 0, 0, 0, 1, 1, 0, 1};
   int size = sizeof(arr) / sizeof(arr[0]);
   sub_zero_one(arr, size);
   return 0;
}

출력

위의 코드를 실행하면 다음 출력이 생성됩니다 -

Subarrays with only 0's are : 7
Subarrays with only 1's are : 4