php算法题空间优化核心是避免数组复制、减少中间变量、复用内存、优先原地操作;需用索引代替切片、复用输入数组、慎用高开销内置函数、善用生成器流式处理。

PHP 算法题中空间优化的核心,是避免无谓的数组复制、减少中间变量、复用已有内存,并优先使用原地(in-place)操作。PHP 的数组底层是哈希表,每次 array_merge、array_slice 或函数式写法(如 array_map)都可能隐式创建新数组,显著增加内存开销。
用指针/索引代替切片数组
很多题(如旋转数组、滑动窗口、双指针类)习惯用 array_slice($arr, $i, $len) 提取子数组,但会复制数据。实际只需维护起始/结束下标,直接访问原数组元素即可。
- 例如“最长无重复子串”:不用
substr($s, $left, $right-$left+1)每次截取,改用$s[$i]单字符访问 + 记录$left和$right下标 - 旋转数组(如 LeetCode 189):三次反转原地完成,零额外数组 ——
reverse($nums, 0, $n-1)→reverse($nums, 0, $k-1)→reverse($nums, $k, $n-1)
复用输入数组作为结果容器
当题目允许修改输入时(多数 PHP 算法题不校验输入是否被修改),直接在原数组上写入结果,省去 $res = [] 开辟新空间。
- “移除元素”(LeetCode 27):用快慢指针,将非目标值前移覆盖,最后
array_splice($nums, $slow)截断 —— 比新建数组节省 O(n) 空间 - “合并两个有序数组”(LeetCode 88):从后往前归并,利用 $nums1 尾部预留空间,避免额外数组和正向移动开销
慎用 PHP 内置函数的“高开销副本”行为
部分函数看似简洁,实则暗藏空间膨胀:
立即学习“PHP免费学习笔记(深入)”;
-
array_unique()返回全新数组,且内部重建哈希表;若只需判重,用isset($seen[$val])布尔数组或array_key_exists更轻量 -
array_values()/array_keys()强制重索引或提取键,产生副本;能用foreach ($arr as $k => $v)遍历时直接处理键值,就别提前提取 - 避免
json_encode($huge_array)后又json_decode()回来 —— 字符串序列化本身占内存,且解码生成新结构
用生成器(Generator)流式处理大数据
遇到需遍历大量数据但无需全量加载的场景(如大文件逐行解析、海量 ID 批量查库),用 yield 替代 return array:
- 函数返回
Generator,调用方用foreach迭代,内存只存当前项 - 例:读取百万行日志过滤关键词,不用
$lines = file($file); foreach ($lines as $line)全载入,而用foreach (logLines($file) as $line),其中logLines()是 yield 实现的生成器











