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 等。

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

相关推荐
玖釉-2 小时前
下一个排列:从字典序到原地算法的完整推导
数据结构·c++·windows·算法
IronMurphy2 小时前
【算法五十】62. 不同路径
算法
影寂ldy3 小时前
C#一维数组
算法
枕星而眠3 小时前
数据结构八大排序详解(一):四大简单排序
c语言·数据结构·c++·后端
过期动态3 小时前
【LeetCode 热题 100】移动零
java·数据结构·算法·leetcode·职场和发展·rabbitmq
努力努力再努力wz3 小时前
【Qt入门系列】:按钮组件全解析:从 QAbstractButton 到快捷键事件、单选与复选机制
c语言·开发语言·数据结构·c++·git·qt·github
skywalk81634 小时前
言知(Yanzhi)系统提升建议报告和完工报告 by AutoCoder
开发语言·编程
计算机安禾4 小时前
【算法分析与设计】第10篇:下界理论与NP完全性初步
大数据·人工智能·算法
yunn_4 小时前
单例模式两种实现方法
开发语言·c++·单例模式