有一個數組,由正整數、負整數、零組成,求和最大的連續子數組

$arr = [-11,1,111,-120,1,1,1,-55,-1,21,-1,1,1,1,1,-55,-1,130,1,1,-1];
// 歷史最大
$log_arr = [
	'start_item' => 0,
	'value' => 0,
	'end_item' => 0
];
// 當前最大
$now_arr = [
	'start_item' => 0,
	'value' => 0,
	'end_item' => 0,
	'now_value' => 0
];
for($i = 0;$i<count($arr);$i++){
	echo $arr[$i]+$now_arr['now_value'].'<br/>';
	// 如果當前項加上累計值等於0就說明這個值是當前最大值
	if( $arr[$i]+$now_arr['now_value'] < 1 ){
		// 對比當前最大值和歷史最大值
		if($log_arr['value'] < $now_arr['value']){
			$log_arr = $now_arr;
		}
		$now_arr = [
			'start_item' => 0,
			'value' => 0,
			'end_item' => 0,
			'now_value' => 0
		];
	}
	// 如果當前項加上累計值大於0就說明還有繼續擴大的可能
	if( $arr[$i]+$now_arr['now_value'] > 0 ){
		// 如果當前第一次累加 設置起始項
		if($now_arr['now_value'] == 0){
			$now_arr['start_item'] = $i;
		}
		// 更新累計值
		$now_arr['now_value'] = $now_arr['now_value']+$arr[$i];
		// 如果累計值大於基本值 更新基本值
		if($now_arr['now_value']>$now_arr['value']){
			$now_arr['value'] = $now_arr['now_value'];
			$now_arr['end_item'] = $i;
		}
	}
	// 如果當前項加上累計值小於0就說明這不是起始位置 什麼都不用做
}
if($log_arr['value'] < $now_arr['value']){
	$log_arr = $now_arr;
}
echo '最大值爲:'.$log_arr['value'].'<br/>';
echo '開始項爲:'.$log_arr['start_item'].'<br/>';
echo '終止項爲:'.$log_arr['end_item'].'<br/>';
exit;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章