<?php $arr = [1, 2, -4, 4, 10, -3, 4,-5, 1]; function getNextArray($arr) { //原理:用MaxSum CurSum循环加判断控制从哪个下标开始计数 $MaxSum = 0; //最大累加和 $CurSum = 0; //当前累加和 $len = count($arr); $j = 0; for($i=0;$i<$len;$i++) { $CurSum += $arr[$i]; //因为元素有正有负,因此子序列的最大和一定大于0 if($CurSum > $MaxSum){ $curArr = []; //若当前累加和>最大累加和,则赋值$MaxSum = $CurSum $MaxSum = $CurSum; $curArr[] = $arr[$i]; $array[] = $arr[$i];//存储子元素 if(!empty($tmp)){ //如果上一次循环有负值,则先剔除值$arr[$i],再合并 unset($array[$j]); $array = array_merge($array,$tmp,$curArr); $tmp = []; } $j++; }elseif($CurSum>0){ //记录$arr[$i]负值,如果下次循环满足条件则合并数组 $tmp[] = $arr[$i]; } //累加和小于0最大的子序列不包含前面的元素,全部重置 if($CurSum < 0) { $CurSum = 0; $array = []; $tmp = []; $j = 0; } } return $array; } $sunArray = getNextArray($arr); print_r($sunArray);
求一个整数数组中和最大的连续子数组,例如:[1, 2, -4, 4, 10, -3, 4, -5, 1]的最大连续子数组是[4, 10, -3, 4]
猜你喜欢
转载自blog.csdn.net/weixin_42075590/article/details/80621884
今日推荐
周排行