【數據結構與基礎面試入門】第一次牛刀小試:最大子列和問題

在我們簡單學完了數據結構和算法的基礎概念之後,我們可以開始第一次的實踐練習。

問題描述

給定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),當數據規模變大的時候,這個複雜度也是很大的嘛。雖然很愚蠢的一個方法,但是至少能達到題目要求了。知識點是以前學過的雙重循環和簡單的序列求和常規方法。

尹成老師帶你學算法

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