「这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战」
编程世界总是离不了算法
最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力
于是决定蹭着假期,加强算法和数据结构相关的知识
那怎么提升呢?
其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode刷题之旅
第一阶段目标是:200道,每天1到2篇
为了不乱,本系列文章目录分为三部分:
- 今日题目:xxx
- 我的思路
- 代码实现
今天题目:1447. 最简分数
难度:中等
给你一个整数 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 输出:[]
我的思路
- 使用
Set来判断当前分数是否是最简,因为若不是最简的,分数的值在之前肯定出现过了 - 暴力遍历所有
0到1到分数,将最简分数加入res即可
代码实现
const simplifiedFractions = n => {
// 使用set判断是否最简分数
// 因为若不是最简,他们的比值之前肯定出现过
const set = new Set();
const isSimple = (a, b) => {
// 比值出现过,不是最简
if (set.has(a / b)) return false;
set.add(a / b);
// 是最简
return true;
};
const res = [];
for (let i = 2; i <= n; i++) {
for (let j = 1; j <= i - 1; j++) {
// 暴力遍历,若是最简,放入res
if (isSimple(j, i)) {
res.push(`${j}/${i}`);
}
}
}
return res;
};
总结
实现方式其实有很多,这里仅供参考~
由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹