C语言 算法 LeetCode 编号 70 - 爬楼梯

目录

[【计时开始 - 15分钟】](#【计时开始 - 15分钟】)

[2-7 分钟:设计 C 实现思路](#2-7 分钟:设计 C 实现思路)

[7-12 分钟:编写 C 代码](#7-12 分钟:编写 C 代码)

[12-14 分钟:简单测试与代码审查](#12-14 分钟:简单测试与代码审查)

[14-15 分钟:最终检查](#14-15 分钟:最终检查)

【比赛结束】

[C 语言版快闪赛的特点](#C 语言版快闪赛的特点)


如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

【计时开始 - 15分钟】

0-2 分钟:理解题目,识别模式

  • 同前,这是一个斐波那契数列变种。
  • F(n) = F(n-1) + F(n-2)F(1)=1, F(2)=2

2-7 分钟:设计 C 实现思路

  • 算法选择:动态规划,迭代法,O(1) 空间。
  • C 工程落地考虑
    • 函数定义 :通常是 int climbStairs(int n)
    • 整数范围 :C 语言的 int 类型在不同平台可能为 16、32 或 64 位。但标准规定 int 至少能表示 -32767 到 +32767。在 LeetCode 这种在线判题环境中,int 通常是 32 位的。F(45) 约 1.8 x 10^9,刚好在 32 位 int 的范围内(最大值约 2.1 x 10^9),所以 int 足够。
    • 变量:需要两个变量存储前两项的值。
    • 循环:从 3 迭代到 n。
    • 边界处理n=1, n=2
    • 注释 :使用 C 风格的注释 (/* ... *///)。

7-12 分钟:编写 C 代码

#include <stdio.h> // LeetCode 平台通常会包含,或需要时自己添加

// LeetCode 平台通常要求在一个结构体或直接的函数中实现

// 这里假设是直接的函数实现,类似 C++ 的 Solution 类中的方法

/**

* @brief 计算爬 n 阶楼梯的总方法数。

*

* @param n 楼梯总阶数 (1 <= n <= 45)。

* @return 到达楼顶的不同方法数。

*

* @details

* 思路:这是一个经典的斐波那契数列问题。

* 到达第 i 阶的方法数,等于到达第 i-1 阶(再走1步)与到达第 i-2 阶(再走2步)的方法数之和。

* 令 F(i) 为到达第 i 阶的方法数。

* 递推关系:F(i) = F(i-1) + F(i-2)。

*

* 边界条件:

* F(1) = 1 (只可能走 1 步)

* F(2) = 2 (可能走 1+1 或 2)

*

* 采用动态规划(迭代法)实现,空间复杂度为 O(1),时间复杂度为 O(n)。

* C 语言的 int 类型(通常为 32 位)足够存储 F(45) 的结果,因为 F(45) 约 1.8 x 10^9 < INT_MAX (约 2.1 x 10^9)。

*/

int climbStairs(int n) {

// 处理基本边界情况

if (n == 1) {

return 1;

}

if (n == 2) {

return 2;

}

// 使用 O(1) 空间复杂度的动态规划

// prev2 存储 F(i-2) 的值, prev1 存储 F(i-1) 的值

int prev2 = 1; // 对应 F(1)

int prev1 = 2; // 对应 F(2)

// 从第 3 阶开始迭代计算,直到第 n 阶

// 循环执行 n - 2 次

for (int i = 3; i <= n; ++i) { // 使用 ++i 是 C/C++ 的常见写法

// 计算当前阶数的方法数

int currentWays = prev1 + prev2;

// 更新 prev2 和 prev1,为下一轮迭代做准备

prev2 = prev1; // 原来的 F(i-1) 变为下一轮的 F(i-2)

prev1 = currentWays; // 新计算出的 F(i) 变为下一轮的 F(i-1)

}

// 循环结束后, prev1 中存储的就是 F(n) 的值

return prev1;

}

12-14 分钟:简单测试与代码审查

  • 示例 1:n = 2

    • n == 2 返回 2。正确。
  • 示例 2:n = 3

    • prev2 = 1, prev1 = 2
    • i = 3: currentWays = 2 + 1 = 3. prev2 = 2, prev1 = 3.
    • 循环结束,返回 prev1 (3)。正确。
  • 考虑 n=1:代码已处理。

  • 代码风格

    • 函数签名 int climbStairs(int n) 标准。
    • 变量命名 prev2, prev1, currentWays 良好。
    • 注释:使用 /** ... */ 风格进行多行注释,解释了思路、递推关系、边界条件和复杂度。
    • for (int i = 3; i <= n; ++i):C 语言的 for 循环,++i 的使用。
  • 工程落地:代码结构清晰,逻辑正确,注释规范,边界处理到位。

14-15 分钟:最终检查

  • 代码逻辑正确,通过示例。
  • 符合 C 和 LeetCode 提交要求。
  • int 类型足够。
  • 包含 #include <stdio.h> (尽管在此题中 printf 等未用到,但在 C 语言中,标准库的引入是基础)。

【比赛结束】

最终提交(模拟):

#include <stdio.h> // 包含标准输入输出库,虽然在此题中未直接使用,但作为 C 语言基础

/**

* @brief 计算爬 n 阶楼梯的总方法数。

*

* @param n 楼梯总阶数 (1 <= n <= 45)。

* @return 到达楼顶的不同方法数。

*

* @details

* 思路:这是一个经典的斐波那契数列问题。

* 到达第 i 阶的方法数,等于到达第 i-1 阶(再走1步)与到达第 i-2 阶(再走2步)的方法数之和。

* 令 F(i) 为到达第 i 阶的方法数。

* 递推关系:F(i) = F(i-1) + F(i-2)。

*

* 边界条件:

* F(1) = 1 (只可能走 1 步)

* F(2) = 2 (可能走 1+1 或 2)

*

* 采用动态规划(迭代法)实现,空间复杂度为 O(1),时间复杂度为 O(n)。

* C 语言的 int 类型(通常为 32 位)足够存储 F(45) 的结果,因为 F(45) 约 1.8 x 10^9 < INT_MAX (约 2.1 x 10^9)。

*/

int climbStairs(int n) {

// 处理基本边界情况

if (n == 1) {

return 1;

}

if (n == 2) {

return 2;

}

// 使用 O(1) 空间复杂度的动态规划

// prev2 存储 F(i-2) 的值, prev1 存储 F(i-1) 的值

int prev2 = 1; // 对应 F(1)

int prev1 = 2; // 对应 F(2)

// 从第 3 阶开始迭代计算,直到第 n 阶

// 循环执行 n - 2 次

for (int i = 3; i <= n; ++i) { // 使用 ++i 是 C/C++ 的常见写法

// 计算当前阶数的方法数

int currentWays = prev1 + prev2;

// 更新 prev2 和 prev1,为下一轮迭代做准备

prev2 = prev1; // 原来的 F(i-1) 变为下一轮的 F(i-2)

prev1 = currentWays; // 新计算出的 F(i) 变为下一轮的 F(i-1)

}

// 循环结束后, prev1 中存储的就是 F(n) 的值

return prev1;

}

C 语言版快闪赛的特点

  • 基础性:C 语言不提供类或命名空间,直接以函数形式实现。
  • 手动内存管理(此处不涉及):在更复杂的 C 题目中,内存管理是关键。
  • 类型检查int 类型的使用。
  • 注释风格:经典的 C 风格注释。
  • 基础库#include <stdio.h> 是 C 语言的起点,即使当前问题不需要 printf 等。

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

相关推荐
2zcode4 分钟前
基于MATLAB图像处理的饮料瓶灌装液位检测系统设计与实现
开发语言·图像处理·matlab
Jerry11 分钟前
LeetCode 202. 快乐数
算法
hans汉斯35 分钟前
基于改进交叉熵损失函数与Transformer的心电信号高风险分类研究
功能测试·深度学习·算法·yolo·目标检测·分类·transformer
Jerry37 分钟前
LeetCode 349. 两个数组的交集
算法
必须得开心呀1 小时前
QT解决中文乱码问题
开发语言·qt
YuK.W2 小时前
Leetcode100: 70.爬楼梯、118.杨辉三角、198.打家劫舍
java·算法·leetcode
随意起个昵称2 小时前
状压dp-基础题目2([USACO12MAR] Cows in a Skyscraper G)
c++·算法·动态规划
这不小天嘛2 小时前
JAVA八股——redis篇
java·开发语言·redis
Jerry3 小时前
LeetCode 1002. 查找共用字符
算法
无限的鲜花3 小时前
协程本质是函数加状态机——零基础深入浅出 C++20 协程
c++·算法·c++20