题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和,求所有子数组和中的最大值,要求时间复杂度为O(n)。
分析:时间复杂度为O(n),表明需至多一次循环遍历该数组,遍历该数组时将遍历的元素求和,如果小于0则丢弃当前元素之前的元素,否则就将这个和值累加到最终结果。如果所有元素都小于0,则需找到所有元素中最大的一个元素返回。
参考代码:
#include <iostream>
using namespace std;
int getMaxChildValue(int bufValue[],int length)
{
int resultSum = 0; //最大和
int tempSum = 0; //累计和
int maxValue = 0; //最大值
for (int i = 0; i < length; ++i)
{
if (tempSum <= 0)
tempSum = bufValue[i]; //bufValue[i]左边元素之和小于等于0,则丢弃这些元素
else
tempSum += bufValue[i]; //bufValue[i]左边元素之和大于0,则加上这些元素
if (tempSum > resultSum) //如果当前子数组元素和比保存最大和还要大,则将当前元素和赋给result
resultSum = tempSum;
if (bufValue[i] > maxValue)//如果当前保存元素最大值比当前元素值小,则将当前元素值赋给maxValue
maxValue = resultSum;
}
if (resultSum < 0) //如果所有元素都为负数,则返回最大元素值
return maxValue;
else
return resultSum;//否则返回最大子数组和
}
//test
int main(int argc, char *argv[])
{
int buf[] = { 1, -2, 3, 10, -4, 7, 2, -5, 4 };
cout << getMaxChildValue(buf, sizeof(buf)/sizeof(int))<<endl;
getchar();
return 0;
}
思考:如何将最大值得子数组返回呢?
#include <iostream>
#include <vector>
using namespace std;
int getMaxChildValue(int bufValue[],int length,vector<int> &childBuf)
{
int resultSum = 0; //最大和
int tempSum = 0; //累计和
int maxValue = 0; //最大值
int bufMinIndex = 0;//最大子数组下标起点
int bufMaxIndex = 0;//最大子数组下标终点
for (int i = 0; i < length; ++i)
{
if (tempSum <= 0)
{
tempSum = bufValue[i]; //bufValue[i]左边元素之和小于等于0,则丢弃这些元素
bufMinIndex = i; //重新记录最大子数组起点
}
else
{
tempSum += bufValue[i]; //bufValue[i]左边元素之和大于0,则加上这些元素
}
if (tempSum > resultSum) //如果当前子数组元素和比保存最大和还要大,则将当前元素和赋给result
{
resultSum = tempSum;
bufMaxIndex = i; //重新记录最大子数组终点
}
if (bufValue[i] > maxValue)//如果当前保存元素最大值比当前元素值小,则将当前元素值赋给maxValue
maxValue = resultSum;
}
for (int i = bufMinIndex; i <= bufMaxIndex; i++)
childBuf.push_back(bufValue[i]); //赋值最大子数组并返回
if (resultSum < 0) //如果所有元素都为负数,则返回最大元素值
{
return maxValue;
}
else
return resultSum;//否则返回最大子数组和
}
//test
int main(int argc, char *argv[])
{
int buf[] = { 1, -2, 3, 10, -4, 7, 2, -5, 4 };
vector<int> childBuf;
cout << getMaxChildValue(buf, sizeof(buf)/sizeof(int),childBuf)<<endl;
for each (auto var in childBuf)
cout << var << " ";
getchar();
return 0;
}