Cho mảng n số. Tìm 3 số a,b,c sao cho a+b=c. Ví dụ: [5,32,1,7,10,50,19,21,2] → 21,2,19 vì 2+19=21.
Sắp xếp + hai con trỏ
- Sắp xếp mảng tăng dần.
- Duyệt c từ cuối về đầu (phần tử lớn nhất).
- Dùng hai con trỏ j=0, k=i-1 tìm a+b=c.
- Nếu a+b < c → j++. Nếu a+b > c → k--.
Ví dụ minh họa
#include <iostream>
#include <algorithm>
using namespace std;
void findTriplet(int arr[], int n) {
sort(arr, arr+n);
for (int i = n-1; i >= 0; i--) {
int j = 0, k = i-1;
while (j < k) {
if (arr[i] == arr[j] + arr[k]) {
cout << "Ba so: " << arr[i] << ' ' << arr[j] << ' ' << arr[k];
return;
}
else if (arr[i] > arr[j] + arr[k]) j++;
else k--;
}
}
cout << "Khong co bo ba nao";
}
int main() {
int arr[] = {5, 32, 1, 7, 10, 50, 19, 21, 2};
int n = sizeof(arr)/sizeof(arr[0]);
findTriplet(arr, n);
return 0;
}
Kết quả
Ba so: 21 2 19