PHP 算法 LeetCode 编号 70 - 爬楼梯

目录

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

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

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

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

【比赛结束】

[PHP 版快闪赛的特点](#PHP 版快闪赛的特点)


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

【计时开始 - 15分钟】

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

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

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

  • 算法选择:动态规划,迭代法,O(1) 空间。
  • PHP 工程落地考虑 :
    • 函数定义 :通常是 function climbStairs(int $n): int,类型提示是 PHP 7+ 的特性,能增强代码健壮性。
    • 整数范围 :PHP 的 int 类型也通常是 32 位或 64 位,足够处理 F(45)。
    • 变量:需要两个变量存储前两项的值。
    • 循环:从 3 迭代到 n。
    • 边界处理 :n=1, n=2。
    • 注释 :使用 PHPDoc 风格 (/** ... */)。

7-12 分钟:编写 PHP 代码

<?php

class Solution {

/**

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

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

*

* @description

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

* 到达第 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)。

* PHP 的 int 类型足以处理 F(45) 的结果。

*/

public function climbStairs(int $n): int {

// 处理基本边界情况

if ($n === 1) {

return 1;

}

if ($n === 2) {

return 2;

}

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

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

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

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

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

// 循环执行 n - 2 次

for (i = 3; i <= n; i++) {

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

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 === 1 or $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:代码已处理。

  • 代码风格:

    • class Solution { public function climbStairs(int $n): int { ... } } 符合 PHP 和 LeetCode 模板。
    • 变量命名 $prev2, $prev1, $currentWays 良好,PHP 变量前缀 $ 是必须的。
    • 注释:使用 PHPDoc 风格 (/** ... */),包含 @param, @return, @description,这是 PHP 的标准实践。
    • 类型提示 int 和返回类型 : int 增强了代码的可读性和健壮性。
    • ===:使用严格相等比较。
  • 工程落地:代码结构清晰,逻辑正确,注释规范,边界处理到位。

14-15 分钟:最终检查

  • 代码逻辑正确,通过示例。
  • 符合 PHP 和 LeetCode 提交要求。
  • int 类型足够。

【比赛结束】

最终提交(模拟):

<?php

class Solution {

/**

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

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

*

* @description

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

* 到达第 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)。

* PHP 的 int 类型足以处理 F(45) 的结果。

*/

public function climbStairs(int $n): int {

// 处理基本边界情况

if ($n === 1) {

return 1;

}

if ($n === 2) {

return 2;

}

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

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

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

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

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

// 循环执行 n - 2 次

for (i = 3; i <= n; i++) {

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

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;

}

}

PHP 版快闪赛的特点

  • 类型提示 :int $n 和 : int 增强了代码的清晰度和可维护性。
  • 变量前缀 $:PHP 变量的标志性特征。
  • PHPDoc 注释:与 JSDoc 和 Javadoc 类似,是 PHP 项目的标准文档格式。
  • 严格相等 ===:避免类型转换问题。

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

相关推荐
罗西的思考7 小时前
【轻量化复刻大模型】线性注意力交互式演示
人工智能·算法·机器学习
神也畏惧菠萝7 小时前
Day08 Python流程控制从入门到上瘾:if/match/while/for四件套,从B站登录一路打到猜数字游戏
python·算法·数据存储·for·while·if·ifelse
揽星河..8 小时前
【C语言】分支和循环
c语言·c++·算法
云边云科技_云网融合8 小时前
面向汽车零部件制造业场景的解决方案 | 70 秒:一台车下线的时间里,藏着五张网
开发语言·汽车·php
Fuyo_11199 小时前
C++ AVL树保姆级详解:从平衡因子到四大旋转机制
java·c++·算法
jktantan10 小时前
每个节点 41 字节:把一棵百万节点树拆进 14 个 typed array
前端·javascript·vue.js·算法·typescript
揽星河..10 小时前
【C语言】猜数字游戏
c语言·算法·游戏
李纲明10 小时前
WordPress 媒体库上传图片失败:先核 PHP 体积与目录权限,再查安全插件与对象存储
php·上传·wordpress·媒体库·devdiy
海域云SeaArea_10 小时前
Windows Server 2008 R2 从零安装 IIS7.5(二):php.ini 配置
开发语言·windows·php