【每日算法Day 79】所有人都会做的入门题,但是能看出你的代码能力!

简介: 这两天要帮老师录制一下题解视频,所以题目挑简单一点的,减(shui)轻(liang)大(pian)家(wen)压(zhang)力。

题目链接

LeetCode 面试题 08.01. 三步问题[1]

题目描述

三步问题。有个小孩正在上楼梯,楼梯有  阶台阶,小孩一次可以上  阶、 阶或  阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模 。

示例1

输入:
n = 3 
输出:
4
解释:
有四种走法

示例2

输入:
n = 5
输出:
13

题解

这道题是动态规划入门题,我相信大家都会做,如果不会做,那就当我没说过这句话。

令  为上  个台阶的方案数,那么最后一步可以是跳  步,或者跳  步,或者跳  步过去的,所以就有:

初始情况就是  。

然后利用取模的加法公式,可以每算出一个  都取一下模。

当然了这题太水了,我主要就是想看看大家会怎么实现呢?

代码

定义长度为  的数组

最朴素的方法当然是定义长度为  的数组,然后算就完事了,代码如下:

typedef long long ll;
const ll p = 1e9+7;
const int N = 1e6+10;
class Solution {
public:
    ll f[N] = {1, 2, 4};
    int waysToStep(int n) {
        for (int i = 3; i < n; ++i) {
            f[i] = (f[i-1] + f[i-2] + f[i-3]) % p;
        }
        return f[n-1];
    }
};

定义四个变量

但是这样太费空间了啊,其实每次只需要用到之前的三个状态就行了,然后还要用个临时变量用来交换状态值,代码如下:

typedef long long ll;
const ll p = 1e9+7;
class Solution {
public:
    int waysToStep(int n) {
        if (n == 1) return 1;
        if (n == 2) return 2;
        if (n == 3) return 4;
        ll a = 1, b = 2, c = 4, d;
        for (int i = 3; i < n; ++i) {
            d = (a + b + c) % p;
            a = b;
            b = c;
            c = d;
        }
        return d;
    }
};

定义长度为  的数组

但是用  个变量也太丑陋了,对于我这种处女座患者(对不起我是射手座)来说,完全无法忍受!

所以我直接定义了一个长度为  的数组,然后下标对  取模来实现循环数组,这样代码看起来就很舒服啦:

typedef long long ll;
const ll p = 1e9+7;
class Solution {
public:
    int waysToStep(int n) {
        ll f[3] = {1, 2, 4};
        for (int i = 3; i < n; ++i) {
            (f[i%3] += f[(i-1)%3] + f[(i-2)%3]) %= p;
        }
        return f[(n-1)%3];
    }
};

应读者要求,再来个 python 代码:

class Solution:
    def waysToStep(self, n: int) -> int:
        f = [1, 2, 4]
        for i in range(3, n):
            f[i%3] += f[(i-1)%3] + f[(i-2)%3]
            f[i%3] %= 1e9+7;
        return int(f[(n-1)%3])
相关文章
|
5天前
|
机器学习/深度学习 存储 算法
近端策略优化(PPO)算法的理论基础与PyTorch代码详解
近端策略优化(PPO)是深度强化学习中高效的策略优化方法,广泛应用于大语言模型的RLHF训练。PPO通过引入策略更新约束机制,平衡了更新幅度,提升了训练稳定性。其核心思想是在优势演员-评论家方法的基础上,采用裁剪和非裁剪项组成的替代目标函数,限制策略比率在[1-ϵ, 1+ϵ]区间内,防止过大的策略更新。本文详细探讨了PPO的基本原理、损失函数设计及PyTorch实现流程,提供了完整的代码示例。
109 10
近端策略优化(PPO)算法的理论基础与PyTorch代码详解
|
2月前
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
3月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
99 1
|
3月前
|
存储 缓存 算法
通过优化算法和代码结构来提升易语言程序的执行效率
通过优化算法和代码结构来提升易语言程序的执行效率
|
3月前
|
机器学习/深度学习 算法 Python
机器学习入门:理解并实现K-近邻算法
机器学习入门:理解并实现K-近邻算法
56 0
|
3月前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
3月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
3月前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
67 3
|
4月前
|
缓存 分布式计算 监控
优化算法和代码需要注意什么
【10月更文挑战第20天】优化算法和代码需要注意什么
49 0
|
4月前
|
存储 缓存 算法
如何通过优化算法和代码结构来提升易语言程序的执行效率?
如何通过优化算法和代码结构来提升易语言程序的执行效率?
102 5

热门文章

最新文章