$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;
有一個數組,由正整數、負整數、零組成,求和最大的連續子數組
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.