1447. 最简分数(2022-2-10)
给你一个整数 n
,请你返回所有 0 到 1 之间(不包括 0 和 1)满足分母小于等于 n
的 最简 分数 。分数可以以 任意 顺序返回。
示例 1:
输入:n = 2
输出:[“1/2”]
解释:“1/2” 是唯一一个分母小于等于 2 的最简分数。
示例 2:
输入:n = 3
输出:[“1/2”,“1/3”,“2/3”]
示例 3:
输入:n = 4
输出:[“1/2”,“1/3”,“1/4”,“2/3”,“3/4”]
解释:“2/4” 不是最简分数,因为它可以化简为 “1/2” 。
示例 4:
输入:n = 1
输出:[]
提示:
1 <= n <= 100
解题思路
这里使用暴力枚举,去检验每一种组合是否是最简分数,
而检验方法有很多种,一个是「欧几里得」求最大公约数,如果分子分母的最大公约数为1,则为最简。
另一个是「更相减损法」,也就是互相减,到最后为1则最简。一般在精度要求高的时候使用。
再一种就是使用「哈希表」,来记录每一个最简分数,如果不是最简,那么一定可以在哈希表中找到,比如哈希表中有1/2
,那么2/4
明显等于1/2
,那它就不是最简。
而下面的代码是「哈希表」的实现:
var simplifiedFractions = function(n) {
//分子小于分母
//分母与分子没有公因数
let hash = new Map(),ret = []
for(let j = 1; j <= n;j++){
for(let i = 1; i < j; i++){
let _t = i/j
if(!hash.get(_t)){
ret.push(`${i}/${j}`)
hash.set(_t,`${i}/${j}`)
}
}
}
return ret
};