题目描述: 有一个集合{14,56,53,4,-9,34,...n}里面共n个数
里面可以有负数也可以没有
用一个时间复杂度为o(n)的算法找出其中的一个连续串象(53,4,-9) 这样(串里的数字个数任意)
使得这个连续串为所有这样连续串里各个数字相加和最小的一个
代码实现如下(程序没有考虑有多组解的情况)
#include <iostream>
using namespace std;
template<typename T>
int getMinSum(T* a,int n,T* pbegin,T* pend)
{
T min = a[0];
T sum = a[0];
T tempbegin = 0;
*pbegin = 0;
*pend = 0;
for (int i = 1; i < n; i++)
{
if(sum < 0)
sum = sum + a[i];
else
{
tempbegin = i;
sum = a[i];
}
if (sum < min)
{
min = sum;
*pbegin = tempbegin;
*pend = i;
}
}
return min;
}
int main()
{
int a[] = {8, 9, -3 ,-10 ,7 ,0 ,8 ,-12, 9, 8 ,-1 ,-2 ,9};
int begin;
int end;
int sum;
int k = sizeof(a) / sizeof(int);
sum=getMinSum(a,k,&begin,&end);
cout<<"The min sum is "<<sum<<endl;
cout<<"And the begin is "<<begin<<",and the end is "<<end<<endl;
return 0;
}