wakaka的博客

一个关于0713的故事

面试题31:连续子数组的最大和
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;
}

结果:



阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kekong0713/article/details/52352439
个人分类: 面试、笔试题
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭