Cho số nguyên n. Tìm tất cả phân số đơn giản hóa (tử và mẫu nguyên tố cùng nhau) nằm trong khoảng (0, 1) với mẫu số ≤ n. Kết quả có thể bất kỳ thứ tự.
Ví dụ
Đầu vào: n = 4
Đầu ra: ["1/2","1/3","1/4","2/3","3/4"] (loại "2/4" vì rút gọn thành "1/2").
Thuật toán duyệt mẫu số + GCD
- Duyệt mẫu số
itừ 2 đến n. - Duyệt tử số
jtừ 1 đến i-1. - Tính
g = gcd(i, j). Phân số đơn giản:j/g/i/g. - Dùng
set<string>để loại trùng lặp (do nhiều cặp rút gọn ra cùng phân số). - Chuyển set sang vector trả về.
Triển khai C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
vector<string> simplifiedFractions(int n) {
vector<string> res;
for (int i = 2; i <= n; ++i) {
for (int j = 1; j < i; ++j) {
int g = gcd(i, j);
res.push_back(to_string(j/g) + "/" + to_string(i/g));
}
}
sort(res.begin(), res.end());
res.erase(unique(res.begin(), res.end()), res.end());
return res;
}
};
Độ phức tạp
- Thời gian: O(N^2 log N) - lặp~i^2 cặp, gcd O(log N), sắp xếp O(K log K).
- Không gian: O(K) lưu kết quả, K ≈ 3N^2/π^2.
Kết quả kiểm thử
Đầu vào: 4
Đầu ra: [1/2, 1/3, 1/4, 2/3, 3/4]