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

C++에서 하나의 정렬된 배열에 있는 추가 요소의 인덱스 찾기

<시간/>

이 문제에서는 크기가 n과 n+1인 두 개의 정렬된 배열 arr1과 arr2가 제공되며 추가 요소를 제외하고는 모든 요소가 동일합니다. 우리의 임무는 하나의 정렬된 배열에 있는 추가 요소의 인덱스를 찾는 것입니다. .

문제 설명: 크기가 n인 배열에 없는 n+1 크기의 배열에서 요소의 인덱스를 찾아야 합니다.

문제를 이해하기 위해 예를 들어 보겠습니다.

입력: arr1[n] ={3, 5, 7, 8, 9, 12}
arr2[n+1] ={3, 4, 5, 7, 8, 9, 12}

출력: 1

설명:

값이 4인 요소는 인덱스 1에 있는 추가 요소입니다.

해결 방법 -

문제에 대한 간단한 해결책은 두 배열이 모두 정렬된다는 사실을 사용하는 것입니다. 그리고 같지 않은 단 하나의 요소로 선형 검색을 수행하고 arr1[]에 없는 요소를 arr2에서 찾을 수 있습니다.

알고리즘:

1단계: i에 대한 루프 -> 0에서 n+1,

1.1단계: arr1[i] !=arr2[i]인 경우 홀수 요소를 찾습니다. 루프를 끊습니다.

2단계: i의 값을 반환합니다.

우리 솔루션의 작동을 설명하는 프로그램,

예시

#include <iostream>
using namespace std;

int findExtraElement(int arr1[], int arr2[], int n) {
   
   int i;
   for (i = 0; i < n; i++)
      if (arr1[i] != arr2[i])
         break;
   return i;
}

int main()
{
   int arr1[] = {3, 5, 7, 8, 9, 12};
   int arr2[] = {3, 4, 5, 7, 8, 9, 12};
   int n = sizeof(arr1) / sizeof(arr1[0]);
   int extraIndex = findExtraElement(arr1, arr2, n);
   cout<<"The extra element is at index ("<<extraIndex<<") and the value is "<<arr2[extraIndex];
   return 0;
}

출력

The extra element is at index (1) and the value is 4

이 솔루션은 이진 검색 과 같은 보다 효과적인 검색 기술을 사용하여 더 잘 만들 수 있습니다. 선형 대신 알고리즘의 계산 시간을 줄입니다.

우리 솔루션의 작동을 설명하는 프로그램,

예시

#include <iostream>
using namespace std;

int findExtraElement(int arr1[], int arr2[], int n) {
   
   int extraIndex = n;
   int start = 0, end = n - 1;
   while (start <= end)
   {
      int mid = (start + end) / 2;
      if (arr2[mid] == arr1[mid])
         start = mid + 1;
      else
      {
         extraIndex = mid;
         end = mid - 1;
      }
   }
   return extraIndex;
}

int main()
{
   int arr1[] = {3, 5, 7, 8, 9, 12};
   int arr2[] = {3, 4, 5, 7, 8, 9, 12};
   int n = sizeof(arr1) / sizeof(arr1[0]);
   int extraIndex = findExtraElement(arr1, arr2, n);
   cout<<"The extra element is at index ("<<extraIndex<<") and the value is "<<arr2[extraIndex];
   return 0;
}

출력

The extra element is at index (1) and the value is 4

또 다른 접근 방식:

문제를 해결하는 또 다른 방법은 두 배열 사이의 절대 차이를 찾는 것인데, 이는 추가 요소입니다. 그런 다음 크기가 n+1인 배열에서 이 추가 요소의 인덱스를 찾아야 합니다. 이것은 검색 알고리즘을 사용하여 수행할 수 있습니다.

우리 솔루션의 작동을 설명하는 프로그램,

예시

#include <iostream>
using namespace std;

int calcArraysum(int arr[], int n){
   int sum = 0;
   for(int i = 0; i < n; i++)
      sum += arr[i];
   return sum;
}

int findExtraElement(int arr1[], int arr2[], int n) {
   
   int extraValue = calcArraysum(arr2, n+1) - calcArraysum(arr1, n);

   for (int i = 0; i < n; i++)
   {
      if (arr2[i] == extraValue)
         return i;
   }
   return -1;
}

int main()
{
   int arr1[] = {3, 5, 7, 8, 9, 12};
   int arr2[] = {3, 4, 5, 7, 8, 9, 12};
   int n = sizeof(arr1) / sizeof(arr1[0]);
   int extraIndex = findExtraElement(arr1, arr2, n);
   cout<<"The extra element is at index ("<<extraIndex<<") and the value is "<<arr2[extraIndex];
   return 0;
}

출력

The extra element is at index (1) and the value is 4