You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:32:55