求一个整数数组中和最大的连续子数组,例如:[1, 2, -4, 4, 10, -3, 4, -5, 1]的最大连续子数组是[4, 10, -3, 4]

<?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);

猜你喜欢

转载自blog.csdn.net/weixin_42075590/article/details/80621884
今日推荐