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

C++에서 2의 합이 세 번째 요소와 같은 삼중항 찾기

<시간/>

n개의 숫자 배열이 있다고 가정합니다. 두 요소의 합이 세 번째 요소와 같도록 세 개의 숫자를 찾아야 합니다. 따라서 배열이 [5, 32, 1, 7, 10, 50, 19, 21, 2]와 같으면 출력은 21, 2, 19가 됩니다. 그러한 요소가 발견되지 않으면 해당 메시지를 표시합니다.

이 문제를 해결하기 위해 다음과 같은 몇 가지 단계를 따릅니다. -

  • 주어진 배열 정렬

  • 그런 다음 마지막 요소에서 가장 큰 요소를 수정하기 시작하고 배열을 탐색하여 세 번째 요소를 합하는 다른 두 숫자를 찾습니다.

  • 두 개의 포인터 j와 k를 취합니다. j는 처음부터, k는 i - 1에서 두 숫자 중 가장 작은 숫자를 찾는 마지막 숫자부터 나머지 두 숫자 중 가장 큰 숫자를 찾습니다.

  • 두 숫자의 합이 여전히 Arr[i]보다 작으면 두 숫자의 합산 값을 늘려야 하므로 j 포인터를 늘려 Arr[j] + Arr[의 값을 증가시켜야 합니다. k]

  • 두 숫자의 합이 Arr[i]보다 크면 두 숫자의 합 값을 줄여 포인터 k를 줄여 Arr[j] + Arr[k의 전체 값을 감소시켜야 합니다. ]

예시

#include<iostream>
#include<algorithm>
#define N 5
using namespace std;
void getValueTriplet(int arr[], int n) {
   sort(arr, arr + n);
   for (int i = n - 1; i >= 0; i--) {
      int j = 0;
      int k = i - 1;
      while (j < k) {
         if (arr[i] == arr[j] + arr[k]) {
            cout << "The numbers are " << arr[i] << " " << arr[j] << " " << arr[k] << endl;
            return;
         }
         else if (arr[i] > arr[j] + arr[k])
         j += 1;
         else
         k -= 1;
      }
   }
   cout << "No such triplet exists";
}
int main() {
   int arr[] = { 5, 32, 1, 7, 10, 50, 19, 21, 2 };
   int n = sizeof(arr) / sizeof(arr[0]);
   getValueTriplet(arr, n);
}

출력

The numbers are 21 2 19