每日回顾
刚刚做出了一个特别可惜的选择,但要明白的是,在一个果园里,当前看到的果子或许感觉很大,当你只能拿得动一个果子的时候,你会寻找更大的还是就摘下眼前的这一个。
这个选择只能成为我的跳板!
回归正题:
俺~(大一)算法菜鸡,想要学习过程中记录一下,也顺便能够分享给新入门的朋友们。
今天开始第一天力扣刷题,当然只敢刷简单题了–对于python还不是很熟练。
这一道题特别有趣,题目是这样的:
LCP 02. 分式化简
有一个同学在学习分式。他需要将一个连分数化成最简分数,你能帮助他吗?
连分数是形如上图的分式。在本题中,所有系数都是大于等于0的整数。
输入的cont
代表连分数的系数(cont[0]
代表上图的a0
,以此类推)。返回一个长度为2的数组[n, m]
,使得连分数的值等于n / m
,且n, m
最大公约数为1。
示例 1:
输入:cont = [3, 2, 0, 2]
输出:[13, 4]
解释:原连分数等价于3 + (1 / (2 + (1 / (0 + 1 / 2))))。注意[26, 8], [-13, -4]都不是正确答案。
刚开始想的时候,只感觉应该从后算起,按照一般平常的思路便是如此了。
那应该不是很难,但是化为最简?从答案中的分子或者分母较小的开始向下寻找公约数,直到1?
可能比较复杂
仔细观察:它的规律是一个整数加上一个分数的形式(如果直接看到最后的那个)便是:
a
n
−
1
+
1
a
n
a_{n-1}+\frac{1}{a_n}
an−1+an1
真的如此吗?
不,请看,最后的是
a
n
+
0
1
a_n+\frac{0}{1}
an+10
如果:
numerator = 0 # 分子
denominator = 1 # 分母
# 接下来的分母会是 a_n * denominator + numerator
# 那么分子是 原来的分母
# 分母是 上一个an*上一个分母 + 上一个分子
# 可能会比较难懂
一个个推到可能更加清楚:
a
n
+
n
d
=
a
n
∗
d
+
n
n
这
里
的
结
果
分
子
成
为
下
面
中
间
式
子
的
分
母
,
分
母
成
为
分
子
a
n
−
1
+
1
a
n
+
n
d
=
a
n
−
1
+
n
a
n
∗
d
+
n
=
a
n
−
1
∗
(
a
n
∗
d
+
n
)
+
n
a
n
∗
d
+
n
这
一
个
也
将
会
是
如
此
a_n+\frac{n}{d} = \frac{a_n*d+n}{n}\\这里的结果分子成为下面中间式子的分母,分母成为分子 \\a_{n-1}+\frac{1}{a_n+\frac{n}{d}}=a_{n-1}+\frac{n}{a_n*d+n}=\\\frac{a_{n-1}*(a_n*d+n)+n}{a_n*d+n}这一个也将会是如此
an+dn=nan∗d+n这里的结果分子成为下面中间式子的分母,分母成为分子an−1+an+dn1=an−1+an∗d+nn=an∗d+nan−1∗(an∗d+n)+n这一个也将会是如此
按照这样的描述:
代码就能写出来了:
class Solution:
def fraction(self, cont: List[int]) -> List[int]:
m, c = 1, 0 # 代表最初的分母分子
for i in cont[::-1]: # 切片 反向遍历
# 上一个分子成为现在的分母,整数*分母+分子成为新的分子
m, c = i * m + c, m
# 因为没有下一轮,所以原本应当成为下一轮的分母的数会是这一轮的分子
return [m, c]
注:思路并不是自己想出来的,还是太菜了/(ㄒoㄒ)/~~