【最大子数组问题】php实现

这个版本还有bug,待修复

<?php
//最大子数组问题:
//数组a[l...h]中有正有负,求a的连续最大子数组。
//如果把a分开两半,则子数组可能有3种情况
//1.子数组在a[l...m]中
//2.子数组在a[m+1...h]中
//3.子数组跨越a[l...m]和a[m+1...h]
//而a的最大子数组是这三种情况中的最大者,1、2两种情况可以递归地求,剩下的全部工作就是寻找跨越中点m的子数组然后取最大值
/*
*函数find_crossing_arr用来寻找跨越中点的最大子数组
*/
function find_crossing_arr($arr)
{
	$mid=intval(count($arr)/2);//中点
	$left_sum=-9999;
	$sum=0;
	for($i=$mid;$i>=0;$i--)//遍历中点左边所有,找到最大和$left_sum和最大和时左边的下标$left_k
	{
		$sum=$sum+$arr[$i];
		if($sum>$left_sum)
		{
			$left_sum=$sum;
			$left_k=$i;
		}
	}
	
	$right_sum=-9999;
	$sum=0;
	for($j=$mid;$j<count($arr);$j++)
	{
		$sum=$sum+$arr[$j];
		if($sum>$right_sum)
		{
			$right_sum=$sum;
			$right_k=$j;
		}
	}
	//现在已经得到$left_sum $right_sum $left_k $right_k
	$max_sum=$left_sum+$right_sum-$arr[$mid];
	$retarr=array_slice($arr,$left_k,($right_k-$left_k+1));
	return $retarr;
}
function find_max_arr($arr)
{
	if(count($arr)<=1)
	{
		return $arr;
	}
	else
	{
		$mid=intval(count($arr)/2);
		echo $mid;
		$left_arr=find_max_arr(array_slice($arr,0,$mid));//左侧最大和数组
		
		$right_arr=find_max_arr(array_slice($arr,$mid+1));//右侧最大和数组

		$mid_arr=find_crossing_arr($arr);//跨越mid的最大和数组
		if((array_sum($left_arr)>array_sum($right_arr))&&(array_sum($left_arr)>array_sum($mid_arr)))
		{
			return $left_arr;
		}
		elseif((array_sum($right_arr)>array_sum($left_arr))&&(array_sum($right_arr)>array_sum($left_arr)))
		{
			return $right_arr;
		}
		else
		{
			return $mid_arr;
		}
	}
}
var_dump(find_max_arr(array(1,2,3,4)));


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值