Formatted question description: https://leetcode.ca/all/1447.html
1447. Simplified Fractions (Medium)
Given an integer n
, return a list of all simplified fractions between 0 and 1 (exclusive) such that the denominator is less-than-or-equal-to n
. The fractions can be in any order.
Example 1:
Input: n = 2 Output: ["1/2"] Explanation: "1/2" is the only unique fraction with a denominator less-than-or-equal-to 2.
Example 2:
Input: n = 3 Output: ["1/2","1/3","2/3"]
Example 3:
Input: n = 4 Output: ["1/2","1/3","1/4","2/3","3/4"] Explanation: "2/4" is not a simplified fraction because it can be simplified to "1/2".
Example 4:
Input: n = 1 Output: []
Constraints:
1 <= n <= 100
Related Topics:
Math
Solution 1.
// OJ: https://leetcode.com/problems/simplified-fractions/
// Time: O(N^2)
// Space: O(1)
class Solution {
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
public:
vector<string> simplifiedFractions(int n) {
vector<string> ans;
for (int i = 2; i <= n; ++i) {
for (int j = 1; j < i; ++j) {
if (gcd(i, j) != 1) continue;
ans.push_back(to_string(j) + "/" + to_string(i));
}
}
return ans;
}
};
Java
class Solution {
public List<String> simplifiedFractions(int n) {
List<String> fractions = new ArrayList<String>();
if (n == 1)
return fractions;
fractions.add("1/2");
for (int denominator = 3; denominator <= n; denominator++) {
int maxNumerator = denominator / 2;
for (int numerator = 1; numerator <= maxNumerator; numerator++) {
if (gcd(numerator, denominator) == 1) {
fractions.add(numerator + "/" + denominator);
fractions.add((denominator - numerator) + "/" + denominator);
}
}
}
return fractions;
}
public int gcd(int num1, int num2) {
if (num1 == 1)
return 1;
while (num1 != 0 && num2 != 0) {
num2 %= num1;
int temp = num1;
num1 = num2;
num2 = temp;
}
return num2;
}
}