1.题目链接:最大子段和
2.题目描述:
最大子段和 给出一个长度为 n$的序列 ,选出其中连续且非空的一段使得这段和最大。
3.输入输出数据以及样例
4.思路
最开始想将数据存入数组,之后进行数组遍历,比较每一个相加后的结果,利用了两个for循环,结果不出所料的超时了。所以在想如何简化时间复杂度。
#include<iostream>
using namespace std;
int main()
{
int n,number=0,i;
cin >> n;
int *item = new int [n];
int max,maxf=-1;
for (i = 0; i < n; i++)
{
cin >> item[i];
max = item[0];
}
for (i = 0; i <n; i++)
{
if (item[i] > 0)
{
for (int j = i; j < n; j++)
{
number += item[j];
if (number > max)
{
max = number;
}
}
}
number = 0;
}
cout << max;
delete[] item;
return 0;
}
若所得之和已经是负数,那就没有必要再进行下去了,因为负数加任何数都在减小,所以我用判断,减少了循环,不满足条件的退出循环从而减少时间复杂度
5.参考代码
#include<iostream>
using namespace std;
int main()
{
int n,number=0,i;
cin >> n;
int *item = new int [n];
int max,maxf=-1;
for (i = 0; i < n; i++)
{
cin >> item[i];
if (i == 0)
{
max = item[0];
}
if (item[i] > max)
{
max = item[i];//把初始数据置为最大的那个,这一步可以防止,数据全是负的情况
}
}
for (i = 0; i <n; i++)
{
if (item[i] >= 0)
{
for (int j = i; j < n; j++)
{
number += item[j];
if (number >= 0)//如果是负的就没必要继续了,负数只会减小
{
if(number>max)
max = number;
}
else break;
}
}
number = 0;
}
cout << max;
delete[] item;
return 0;
}