PHP最小长度子数组和函数调试求助
完善最小长度子数组和的PHP实现
我来帮你补全这段代码!你的核心思路没问题——通过双层循环枚举所有可能的子数组,找到满足和≥$k的最短子数组,同时标记出对应的元素位置。咱们一步步把缺失的逻辑补上,还要优化一些细节让代码更健壮。
完整实现代码
function printArray($arr) { for ($i=0; $i<count($arr); $i++) { echo $arr[$i] . ' '; } echo "\n"; } $arr = [2,3,1,2,4,3]; $k = 7; $arrLength = count($arr); $bestLength = $arrLength + 1; // 初始值设为比最长子数组长度大 $bestMarker = []; // 保存最短子数组的标记 for ($i=0; $i<$arrLength; $i++) { // 用array_fill初始化标记数组,适配任意长度的输入数组 $marker = array_fill(0, $arrLength, 0); $marker[$i] = 1; $sum = $arr[$i]; // 单个元素就满足条件的情况 if ($sum >= $k) { $bestLength = 1; $bestMarker = $marker; break; // 已经是最短长度,直接退出外层循环 } for ($j=$i+1; $j<$arrLength; $j++) { $sum += $arr[$j]; $marker[$j] = 1; if ($sum >= $k) { $currentLength = $j - $i + 1; // 如果当前子数组更短,更新最优解 if ($currentLength < $bestLength) { $bestLength = $currentLength; $bestMarker = $marker; } // 找到当前起始点i下的最短子数组,无需继续扩展(长度只会更长) break; } } } // 输出结果 if ($bestLength <= $arrLength) { echo "找到的最短子数组标记:\n"; printArray($bestMarker); echo "子数组长度:$bestLength\n"; } else { echo "没有找到和≥$k的子数组\n"; }
关键优化与补全说明
- 动态初始化标记数组:用
array_fill(0, $arrLength, 0)替代手动写固定数量的0,这样不管输入数组长度怎么变,代码都能适配,不用手动修改标记数组的初始化代码。 - 保存最优标记数组:新增
$bestMarker变量来记录当前找到的最短子数组的标记,避免最后输出错误的标记。 - 提前终止循环:
- 当单个元素就满足和≥$k时,直接更新最优解并退出外层循环——因为长度1已经是最小可能,没必要继续遍历。
- 内层循环中找到满足条件的子数组后立即break,因为从当前$i开始,再往后扩展子数组长度只会增加,不可能得到更短的解。
- 结果判断:循环结束后检查
$bestLength是否仍大于数组长度,如果是说明没有符合条件的子数组,给出提示;否则输出最优解。
测试结果
对于输入数组[2,3,1,2,4,3]和$k=7,运行代码会输出:
找到的最短子数组标记: 0 0 0 0 1 1 子数组长度:2
对应的子数组是[4,3],和为7,长度2,是满足条件的最短子数组。
内容的提问来源于stack exchange,提问作者Kyle Walter
相关产品推荐
相关产品推荐

