【数据结构与基础面试入门】第一次牛刀小试:最大子列和问题

在我们简单学完了数据结构和算法的基础概念之后,我们可以开始第一次的实践练习。

问题描述

给定N个整数的序列{A1,A2,A3,......AnA_1,A_2,A_3,......A_n},求解函数f(i,j)=max{0,k=ijAk}f(i,j)=max\{0,\sum_{k = i}^jA_k\}的最大值。

看完这个问题描述,其实没有搞明白什么是子列和?问题没有读懂可还行。原来这里面的子列是连续子列的意思,头有点大。突然感觉要计算的东西有些多。

算法1
我们最简单的暴力算法呢,就是把每一个子列和得到再寻找最大值。还没有分析出来具体应该怎么写的时候就已经目测出有很大的计算量了。
int MaxSubseqSum1(int A[],int N)
{/*输入是整个整数序列,以及整数序列里面(元素)的个数*/
	int ThisSum,MaxSum =0;
	int i,j,k;
	for(i=0;i<N;i++){/*i是子列左端的位置*/
		for(j=i;j<N;j++)/*j是子列右端的位置*/
		/*我们在双重循环里面暴力求解子列和,我们还要有一层k循环*/
		ThisSum = 0;/*ThisSum是A[i]到A[j]的子列和*/
		for(k = i;k<=j;k++)
			{
				ThisSum += A[k];
			}
			if(ThisSum>MaxSum)
				MaxSum=ThisSum;
		}/*j循环结束*/
	}/*i循环结束*/
	return MaxSum;
}

我们的算法复杂度由于有三层for循环嵌套,是O(n3)O(n^3),当数据规模变大的时候,这个复杂度也是很大的嘛。虽然很愚蠢的一个方法,但是至少能达到题目要求了。知识点是以前学过的双重循环和简单的序列求和常规方法。

尹成老师带你学算法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章