Cho mảng Arr[] độ dài n. Đếm số bộ ba (i,j,k) với i Ví dụ 1: Ví dụ 2: Sắp xếp mảng. Với mỗi cặp (i,j), tìm target = arr[i]+arr[j] bằng binary search trong phần còn lại.Ví dụ minh họa
Mã nguồn C++ (Vét cạn O(n³))
#include <bits/stdc++.h>
using namespace std;
int countTriplets(int arr[], int n) {
int count = 0;
for (int i = 0; i < n - 2; i++) {
for (int j = i + 1; j < n - 1; j++) {
for (int k = j + 1; k < n; k++) {
if (arr[i] + arr[j] == arr[k] ||
arr[j] + arr[k] == arr[i] ||
arr[k] + arr[i] == arr[j]) {
count++;
}
}
}
}
return count;
}
int main() {
int Arr[] = {1, 2, 2, 3, 4};
int N = 5;
cout << "So bo ba: " << countTriplets(Arr, N);
return 0;
}
Kết quả chạy chương trình
So bo ba: 4Tối ưu hóa O(n²) - Sử dụng Hash Set / Two Pointers
#include <bits/stdc++.h>
using namespace std;
int countTripletsOptimized(int arr[], int n) {
sort(arr, arr + n);
int count = 0;
for (int i = 0; i < n - 2; i++) {
for (int j = i + 1; j < n - 1; j++) {
int sum = arr[i] + arr[j];
// Binary search sum trong [j+1, n-1]
if (binary_search(arr + j + 1, arr + n, sum)) {
// Đếm số lần xuất hiện của sum
auto range = equal_range(arr + j + 1, arr + n, sum);
count += range.second - range.first;
}
}
}
return count;
}
Độ phức tạp
Phương pháp Thời gian Không gian Vét cạn 3 vòng lặp O(n³) O(1) Sắp xếp + Binary Search O(n² log n) O(1) Hash Set (nếu giá trị nhỏ) O(n²) O(M)