登录
首页 >  文章 >  php教程

PHP数组最小路径和算法详解

时间:2026-04-01 15:36:36 431浏览 收藏

本文深入解析了在PHP中实现二维数组“最小路径和”这一经典动态规划问题的高效解法,重点介绍如何通过空间优化的一维DP数组(而非二维)将空间复杂度降至O(n),并给出完整、健壮、带边界处理的PHP代码实现;文章不仅阐明状态定义与转移逻辑(dp[j] = grid[i][j] + min(dp[j], dp[j−1])),还涵盖初始化技巧、常见陷阱(如空输入、单行/列特例)及测试验证方法,帮助开发者真正理解原理并写出可直接落地的高性能代码。

PHP 数组最小路径和算法实现

PHP 中实现“数组最小路径和”通常指在二维数组(如矩阵)中,从左上角出发,每次只能向右或向下移动,到达右下角的最小路径和。这不是 PHP 特有算法,而是经典动态规划问题,但可用 PHP 清晰表达。

理解问题与状态定义

给定一个 m × n 的非负整数二维数组 $grid,起点为 $grid[0][0],终点为 $grid[m-1][n-1],每步只能向右或向下走一格,求所有可行路径中数字总和最小的一条。

核心思路:到达位置 (i, j) 的最小路径和,只依赖于上方 (i-1, j) 和左方 (i, j-1) 的最小路径和。

状态转移方程:
$dp[i][j] = $grid[i][j] + min($dp[i-1][j], $dp[i][j-1])

空间优化的 PHP 实现(推荐)

无需额外二维数组,直接在原数组上更新,或使用一维数组降低空间复杂度至 O(n):

  • 初始化一维数组 $dp 长度为列数 count($grid[0])
  • 第一行单独处理:每个位置只能从左来,累加即可
  • 从第二行开始,每行遍历各列:当前值 = 当前网格值 + min(上方 dp 值, 左侧 dp 值)
  • 最终 $dp[n-1] 即为答案

示例代码:

function minPathSum($grid) {
    if (empty($grid) || empty($grid[0])) return 0;
    $m = count($grid);
    $n = count($grid[0]);
    $dp = array_fill(0, $n, 0);
    
    // 初始化第一行
    $dp[0] = $grid[0][0];
    for ($j = 1; $j 

边界情况与注意事项

  • 输入为空数组或某行为空时需提前返回 0,避免索引错误
  • 单行或单列数组是合法输入:此时路径唯一,直接求和即可
  • PHP 中数组下标从 0 开始,注意 $grid[$i][$j] 的合法性判断(尤其在调试时可加 isset 检查)
  • 若需返回具体路径而非仅和值,需额外维护方向数组或回溯,复杂度上升

测试用例验证

例如输入:
[[1,3,1],[1,5,1],[4,2,1]]
期望输出:7(路径:1→3→1→1→1)

调用 minPathSum($grid) 应正确返回 7。建议用几个小规模矩阵(1×1、1×4、3×1、2×2)交叉验证逻辑鲁棒性。

今天带大家了解了的相关知识,希望对你有所帮助;关于文章的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>