最大差值等于数组最大值减最小值,只需一次遍历或调用min()/max()函数;空数组或单元素需预先判断,避免警告。

要找出 PHP 数组中任意两个元素的最大差值(即最大值减最小值),关键不是暴力比较所有数对,而是只需一次遍历找到数组的最小值和最大值,差值自然得出。
适用场景与前提条件
该问题默认指“无序数组中全局最大差值”,即 max(array) - min(array)。它不要求元素位置顺序(如不能后往前减),也不限制索引关系。若题目要求“后面元素减前面元素的最大差值”(如股票买卖问题),则属于另一类,需单独处理。
基础解法:单次遍历找极值
PHP 内置函数可直接解决:
-
使用 min() 和 max():最简洁,适合小到中等规模数组
$diff = max($arr) - min($arr); -
手动遍历(更可控,适合大数组或需兼容旧版本):
初始化 $min 和 $max 为第一个元素,逐个比较更新;时间复杂度 O(n),空间 O(1)
注意事项与边界处理
实际编码中需预防几类异常:
立即学习“PHP免费学习笔记(深入)”;
- 空数组或单元素数组:调用 min()/max() 会警告,应先判断
count($arr) - 非数值元素:PHP 会尝试类型转换,可能导致意外结果(如字符串 "abc" 转为 0),建议用 array_filter($arr, 'is_numeric') 预处理
- 浮点精度问题:若涉及高精度差值,可考虑使用 BCMath 扩展,但一般场景无需
扩展:带索引约束的最大差值(如 i
若题目明确要求“后一个元素减前一个元素”的最大差值(经典“最佳买卖时机”变种),则不能只看全局极值。正确做法是遍历中维护已见过的最小值,并实时计算当前值与该最小值的差:
- 初始化 $minSoFar = $arr[0],$maxDiff = 0
- 从第 2 个元素开始循环,每次更新:
$maxDiff = max($maxDiff, $arr[$i] - $minSoFar);$minSoFar = min($minSoFar, $arr[$i]); - 该算法仍为 O(n),且保证 j > i











