2019-10-19 吴亲库里 库里的深夜食堂
给定一个n长度的整形数组n以及一个确定的值s。找出总和大于等于s的连续子数组最小长度。如果没有(即总和加起来还没给定值大),直接返回0
首先我们肯定需要定义一个变量用来存储最后的值,先给定int的最大值。我们还需要定义一个变量用来存储左端点的位置。不断缩小满足条件的连续子数组的长度,可能听起来很模糊,举个例子。
nums=[2,1,1,5,4,3] s=5
从0开始遍历(i=0) 求满足条件sum>=5的最小子数组长度
在2+1+1的时候sum<=5 不满足条件 此时i=2
当i=3时,sum(9)>=5 得出length=4 此时当然不是最小的连续子数组
所以此时向右移动一位 并把总和减去当前的值 $num -=$nums[$left]
此时 $num=7>=5 继续移动.....直到移动。。直到发现5的位置一个子数组就满足条件
class Solution {
/**
* @param Integer $s
* @param Integer[] $nums
* @return Integer
*/
function minSubArrayLen($s, $nums) {
$res=PHP_INT_MAX;
$left=0;
for($i=0;$i<count($nums);$i++){
$sum +=$nums[$i];
while($sum>=$s){
$res=min($res,$i+1-$left);
$sum -=$nums[$left++];
}
}
return $res !=PHP_INT_MAX?$res:0;
}
}