算法——求数组中最大子数组和

题目


有一输入数组,数组里面的数字都是整数,可能为正,可能为负,也可能是0,要求该输入数组中最大子数组的和。

题目分析

面对这样的一个问题,首先需要仔细分析问题的条件与问题所求。这个问题提供了一个输入数组,里面会有若干个元素,每个元素可以为正数,可以为负数,也可以为0。而题目要求输出该数组中最大子数组的和,注意是要求连续相邻的若干元素组成的子数组,并且保证该子数组的和最大。

这个问题具体最优子结构,无后效性等动态规划的特点,因此可以用动态规划来解决。

设原输入数组为data[],利用另一个数组dp[i]来表示以data[i]结尾的子数组的最大和:


dp[i]=max(sum(data[start....end]))   0<=start<=end<=i 


因此最大的子数组就是dp数组中的最大值。

在实际的代码实现中可以简化dp数组,用一个变量替代他,并且实时的更新最大和,以及子数组的起始位置和结束位置。


代码部分

下面是实现该题目的部分代码:

#define LENGTH 10

int max_subset(int *data,int len,int *s,int *l)
{
	int max=0;
	int i,j;
	int sum=0;
	int start,end;

	for(i=0;i<len;i++)
	{
		if(sum<=0)
		{
			sum=data[i];
			start=end=i;
		}
		else
		{
			sum=sum+data[i];
			end=i;
		}
		if(sum>max)
		{
			max=sum;
			*s=start;
			*l=end;
		}
			
	}

	if(max==0)
	{
		max=data[0];
		*s=*l=0;
		for(i=1;i<len;i++)
		{
			if(data[i]>max)
			{
				max=data[i];
				*s=*l=i;
			}
		}
	}
	return max;
}
int main()
{

	int data[LENGTH]={-1,-2,3,10,-4,7,-2,5,-9,-1};
	int result=0;
	int s,l;
	result=max_subset(data,LENGTH,&s,&l);
	printf(" max sub set is %d  from %d to %d \n",result,s,l);

	return 0;
}

小结

这是一道经典的题目,被很多公司笔试面试所采用,值得仔细研究。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值