Leetcode每日刷题【易】--Day 1

每日回顾

刚刚做出了一个特别可惜的选择,但要明白的是,在一个果园里,当前看到的果子或许感觉很大,当你只能拿得动一个果子的时候,你会寻找更大的还是就摘下眼前的这一个。
这个选择只能成为我的跳板!

回归正题

俺~(大一)算法菜鸡,想要学习过程中记录一下,也顺便能够分享给新入门的朋友们。

今天开始第一天力扣刷题,当然只敢刷简单题了–对于python还不是很熟练。

这一道题特别有趣,题目是这样的:

LCP 02. 分式化简

有一个同学在学习分式。他需要将一个连分数化成最简分数,你能帮助他吗?

img

连分数是形如上图的分式。在本题中,所有系数都是大于等于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} an1+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=nand+nan1+an+dn1=an1+and+nn=and+nan1(and+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ㄒ)/~~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JamePrin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值