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

0과 1의 정렬된 배열이 주어지면 C++에서 배열의 전환점을 찾습니다.

<시간/>

0과 1만 포함하는 정렬된 숫자 배열이 주어지면 전환점을 찾으십시오. 전환점은 배열에 나타나는 첫 번째 '1'의 인덱스입니다. 예를 들어,

입력-1 -

N = 6
arr[ ] = {0,0,0,0,1,1}

출력 -

4

설명 − 0과 1을 포함하는 주어진 배열에서 인덱스 '4'에 있는 요소가 숫자 '1'을 갖는 것을 볼 수 있습니다.

입력-2 -

N = 5
arr[ ] = {0,0,1,1,1}

출력 -

2

설명 − 0과 1을 포함하는 주어진 배열에서 인덱스 '2'에 있는 요소가 숫자 '1'을 갖고 있음을 알 수 있습니다. 따라서 2를 반환합니다.

이 문제를 해결하기 위한 접근 방식

주어진 정수 배열에서 첫 번째 1의 인덱스를 찾아야 합니다. 이 특정 문제를 해결하기 위해 이진 검색 방법을 사용하여 첫 번째 '1'의 인덱스를 찾는 문제를 해결할 수 있습니다.

  • N 이진 숫자의 배열을 입력 받아

  • 이제 transitionPoint(int *arr, int n) 함수는 배열과 크기를 입력으로 받아 배열에 나타나는 첫 번째 '1'의 인덱스를 반환합니다.

  • '0'과 '1'로 초기화되는 두 개의 포인터를 low, high로 가져옵니다.

  • 이제 배열의 중간 지점을 찾아 '1'인지 확인합니다.

  • 배열의 중간이 '1'이면 인덱스를 반환하고 그렇지 않으면 앞으로 이동하여 확인합니다.

  • 하위 포인터를 증가시키고 '1'을 다시 확인하십시오.

  • '1'이 나오지 않을 때까지 단계를 반복합니다.

예시

#include <bits/stdc++.h>
using namespace std;
int transitionPoint(int *arr, int n){
   int low=0;
   int high= n-1;
   while(low<=high){
      int mid = (low+high)/2;
      if(arr[mid]==0)
         low= mid+1;
      else if(arr[mid]==1){
         if(mid==0 || (mid>0 && arr[mid-1]==0))
            return mid;
         high= mid-1;
      }
   }
   return -1;
}
int main(){
   int n= 6;
   int arr[n]= {0,0,0,1,1,1};
   int ans= transitionPoint(arr,n);
   if(ans>=0){
      cout<<"Transition Point is:"<<ans<<endl;
   }
   else{
      cout<<"Not Found"<<endl;
   }
   return 0;
}

출력

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

Transition Point is: 3

주어진 배열 {0,0,0,1,1,1}에는 인덱스 '3'에 요소 '1'이 있으므로 출력을 '3'으로 얻습니다.