求最大子数组和

我们先来第一种简单的方法。
——穷举所有可能性,返回一个最大的值。(该方法耗时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;
}


发布了21 篇原创文章 · 获赞 3 · 访问量 601

猜你喜欢

转载自blog.csdn.net/W96866/article/details/105694058