Cho mảng Arr[]. Đếm số bộ ba (i Ví dụ 1: Ví dụ 2: Tích nhỏ nhất sẽ đến từ 3 số nhỏ nhất (sau khi sắp xếp). Sắp xếp mảng: a₀ ≤ a₁ ≤ a₂ ≤ ... Tích nhỏ nhất = a₀ × a₁ × a₂. Đếm số cách chọn 3 phần tử cho tích này:Ví dụ minh họa
Mã nguồn C++ (Hai lần duyệt O(n³))
#include <bits/stdc++.h>
using namespace std;
int countTriplets(int arr[], int n) {
int count = 0;
int minprod = INT_MAX;
// Lần 1: Tìm tích nhỏ nhất
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++) {
int prod = arr[i] * arr[j] * arr[k];
if (prod < minprod) minprod = prod;
}
}
}
// Lần 2: Đếm bộ ba có tích = minprod
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++) {
int prod = arr[i] * arr[j] * arr[k];
if (prod == minprod) count++;
}
}
}
return count;
}
int main() {
int Arr[] = {1, 2, 3, 1, 2, 6};
int N = 6;
cout << "So bo ba co tich nho nhat: " << countTriplets(Arr, N);
return 0;
}
Kết quả chạy chương trình
So bo ba co tich nho nhat: 2Tối ưu hóa O(n log n) - Sắp xếp + Tổ hợp
#include <bits/stdc++.h>
using namespace std;
long long nCk(long long n, int k) {
if (n < k) return 0;
if (k == 2) return n * (n - 1) / 2;
if (k == 3) return n * (n - 1) * (n - 2) / 6;
return 0;
}
long long countTripletsOptimized(int arr[], int n) {
sort(arr, arr + n);
unordered_mapĐộ phức tạp
Phương pháp Thời gian Không gian Hai lần O(n³) O(n³) O(1) Sắp xếp + đếm tần suất O(n log n) O(n)