我们先来第一种简单的方法。
——穷举所有可能性,返回一个最大的值。(该方法耗时O(n*n))
#include<iostream>
#include<vector>
int getMaxSubArr(const vector<int> arr)
{
if(arr.size() == 0)
{
return 0;
}
if(arr.size() == 1)
{
return arr[0];
}
int result = 0; //定义一个储存最终结果的变量
for(int i=0; i<arr.size(); i++) //遍历整个数组
{
int temp = 0;
for(int j=i; j<arr.size(); j++) //遍历所有可能组成的字串
{
temp += arr[j]; //每一种可能的字串,求它的和。再和之前保存的result比较取较大值。
std::max(temp, result);
}
}
return result;
}
第二种方法
——动态规划 无需新开辟内存。空间复杂度定义以变量O(1),时间复杂度O(n)
#include<iostream>
#include<vector>
int getMaxSubArr(vector<int> arr)
{
if(arr.size() == 0)
{
return 0;
}
if(arr.size() == 1) //若有一个元素则直接返回该元素值。
{
return arr[0];
}
int result;
int temp;
for(int i = 0; i<arr.size(); ++i) //遍历所有的元素
{
temp += arr[i]; //temp始终维护一个大于0且是最大子数组和的值(该数组元素前提是不都为负数)
if(temp < 0)
{
temp = 0; //如果temp<0则从下一个元素开始重新找子数组和
}
else
{
result = (temp > result ? temp : result); //该3目始终保存最大的字数组和
}
}
return result;
}