php中查找和为目标值的子数组需用前缀和加哈希表,时间复杂度o(n);核心是遍历中查$prefix[j+1]-target$是否已存于map,初始化$map=[0=>-1]$处理从首元素开始的子数组。

在 PHP 中查找和为目标值的子数组,核心思路是利用前缀和(prefix sum)加哈希表优化,将时间复杂度从暴力 O(n²) 降到 O(n)。
理解前缀和与子数组和的关系
子数组 $arr[i..j] 的和 = 前缀和 $prefix[j+1] - $prefix[i]。若该和等于目标值 $target,则有:$prefix[j+1] - $prefix[i] == $target → $prefix[i] == $prefix[j+1] - $target。
也就是说,遍历到位置 j 时,只需快速查出是否曾出现过值为 $prefix[j+1] - $target 的前缀和及其下标。
用关联数组记录最早/最短/所有满足条件的子数组
PHP 中用普通数组(即哈希表)即可高效实现:
艺帆网络工作室网站源码,是国庆后新一批新概念的网站源码,采用流行的Html5和JS组合流畅顺滑,界面清晰明朗,适合科技类企业和公司建站使用。如果你是想成为一家独特的设计公司,拥有独特的文化,追求品质,而非数量与规模。 这种坚持一直贯穿于项目运作之中,从品牌建立、形象推广设计到品牌形象管理。那可以考虑使用这款艺帆网络工作室网站源码。 这款源码中服务项目和团队程序需要在_template文件夹下的in
-
找一个子数组(存在性):键为前缀和,值为对应最小下标(保证子数组尽可能长);遇到匹配就返回
[i+1, j] - 找最短子数组:记录每个前缀和**最后出现的位置**,这样相减后长度最小
-
找所有子数组:用
[$sum => [$index1, $index2, ...]]存储所有下标,每次匹配就遍历对应索引列表
注意边界:前缀和为 0 的情况
空子数组(即从下标 0 开始)的和为 0,对应前缀和 $prefix[0] = 0。必须初始化:$map = [0 => -1];
这样当 $prefix[j+1] == $target 时,可得子数组 [0, j](因为 $prefix[j+1] - 0 == $target,对应 i = -1+1 = 0)。
简单可运行示例(返回任意一个子数组的起止下标)
// 输入:[1, 4, 20, 3, 10, 5], target = 33 → 输出:[2, 4](对应 20+3+10)
$arr = [1, 4, 20, 3, 10, 5];
$target = 33;
$prefix = 0;
$map = [0 => -1];
$result = null;
<p>for ($i = 0; $i < count($arr); $i++) {
$prefix += $arr[$i];
$need = $prefix - $target;
if (isset($map[$need])) {
$start = $map[$need] + 1;
$end = $i;
$result = [$start, $end];
break;
}
$map[$prefix] = $i; // 记录首次出现位置(求最长子数组)
}
var_dump($result); // [2, 4]










