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