关闭

面试题31:连续子数组的最大和

106人阅读 评论(0) 收藏 举报
分类:
1.题目:输入一个整形数组,数组里面有正数也有负数,数组中一个或者连续的多个整数组成一个子数组。求所有子数组的和的最大值,时间复杂度为O(n).
例如:输入的数组为{1,-2,3,10-4,7,2,-5},则和的最大子数组为{3,10,-4,7,2},因此输出为该子数组的和为18.
思路:
可以设置两个变量,逐向相加数组中的每一项,更新这两个变量的值,当累加的子数组的和不为负值时,继续累加,后面累加的值可能是最大值,当为负值的时候就更新子数组和的值,从当前的数据项开始,每一次都和最大的子数组的和进行比较,为了防止数组中的值都是负数,所以刚开始设置最大的子数组的值是最小的负数值,便于比较更新。


源码:
/**
		* 功能说明:找最大子数组的和
		* 作者:K0713
		* 日期:2016-8-29
**/
#include<iostream>
using namespace std;
bool g_InvalidInput = false;
//找最大子数组的和
int FindGreatestSumOfSubArray(int *pData, int nLength)
{
	if ((pData == NULL) || (nLength <= 0))
	{
		g_InvalidInput = true;
		return 0;
	}

	g_InvalidInput = false;

	int nCurSum = 0;
	int nGreatestSum = 0x80000000;//0x80000000是最小的int型(负)数,将nGreatestSum初始化为最小的int值,是为了应对输入全负的情况
	for (int i = 0; i < nLength; ++i)
	{
		if (nCurSum <= 0)
			nCurSum = pData[i];
		else
			nCurSum += pData[i];

		if (nCurSum > nGreatestSum)
			nGreatestSum = nCurSum;
	}

	return nGreatestSum;
}

int main()
{

	int data[] = { 1, -2, 3, 10, -4, 7, 2, -5 };
	int result = FindGreatestSumOfSubArray(data, sizeof(data) / sizeof(int));
	if (g_InvalidInput == false)
		cout << "result:" << result << endl;
	else
		cout << "invalid input!" << endl;
	system("PAUSE");

	return 0;
}

结果:



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:46200次
    • 积分:1290
    • 等级:
    • 排名:千里之外
    • 原创:84篇
    • 转载:15篇
    • 译文:0篇
    • 评论:9条
    最新评论