内容会持续更新,有错误的地方欢迎指正,谢谢!
题目
求一个整型数组中最大的连续子数组的和
输入2, -3, 4, 11, -5, 8, 3, -6
输出21
输入是一组数字,数字本身可以是正数,也可以是负数。输出是这个数组的子数组中最大的求和数。如例子中满足该条件的子数组是:4, 11, -5, 8, 3,求和后的值是21。
分析
题目不难,难点在于如何读取输入的整型数组。
每个数字之间有逗号,但题目并没有明确说是这种输入序列,就是为了考验你。所以,需要过滤掉逗号,才能得到想要的整型数组。
代码
法一:贪心算法,去掉和为负的和,时间复杂度O(n),空间复杂度O(n)
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
vector<int> array;
int temp;
while(cin>>temp)
{
array.push_back(temp);
//cin相关知识:https://blog.csdn.net/BillCYJ/article/details/79775734
if(cin.get()!=',') break;//去除逗号
//或者可以在前面声明一个char变量tempChar,再在这里cin>>tempChar也行
//再或者用while(scanf("%d, ",tmp)!=EOF)也行
}
int length=array.size();
int sum=0,someSum=0;
for (int i=0;i<length;i++)//初始化
{
sum+=array[i];
if (sum<0)
sum=0;
if (sum>someSum)
someSum=sum;
}
if (someSum==0)
{
for (int i=0;i<length;i++)
{
if (someSum==0)
someSum=array[i];
else if (someSum<array[i])
someSum=array[i];
}
}
cout<<someSum;
return 0;
}
法二:动态规划,递推式:someSum[i]=max{someSum[i-1],max{sum[i-1]+array[i],array[i]}},i的取值范围为[1,n-1],时间复杂度O(n),空间复杂度O(1)
//如果用两个一维数组someSum[i]和sum[i],空间复杂度还是O(n),而我就用两个变量则为O(1)。
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
vector<int> array;
int temp;
while(cin>>temp)
{
array.push_back(temp);
if(cin.get()!=',') break;//去除逗号
}
int length=array.size();
int sum=array[0],someSum=array[0];
for(int i=1;i<length;++i)
{
sum=max(sum+array[i],array[i]);
someSum=max(someSum,sum);
}
cout<<someSum;
return 0;
}