$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;
有一个数组,由正整数、负整数、零组成,求和最大的连续子数组
最新推荐文章于 2018-08-02 11:49:15 发布