最大和連續子串

2021-06-14 22:22:17 字數 2194 閱讀 7222

輸入一組整數,求出這個整數陣列最大和的連續

子串。例如,整數陣列為,最大和的連續子串為,最大和為61。需要注意的是要求子串連續,另外,子串的長度可以是1.

這個也是曾經出過的一道面試提,最早是浙大的一道考研演算法設計題。

第一種方法。最簡單的思路就是用兩層迴圈來解決問題。外面一層是從1到整數陣列的長度,裡面的那層迴圈是當前的位置加1一直到整數陣列的結束,裡面的迴圈來算所有的和。

換句話說就是,內層迴圈每次從i+1開始到字元陣列結束的和,這些和是numbers[i]+numbers[i+1],numbers[i]+numbers[i+1]+numbers[i+2],...,numbers[i]+...+numbers[length(numbers)]中找到最大的那個。外層迴圈則是找到全域性最大的那個。這個方法比較好想,只給出偽**,這個的時間複雜度為:

下面是偽**:

for i = 0 to length(numbers)

current = numbers[i]

for j = i + 1 to length(numbers)

current += numbers[j]

if(current_max < current)

current_max = current

endif(max < current_max)

max = current_max

end

第二種思路可以設定乙個變數current_max來儲存當前作出的最大和,用乙個變數max來儲存全域性的最大和。當加到乙個負數時,當前和會減少,但是,是不是會不會改變全域性最大和還需要看後面的乙個元素。而如果當前的current_max變為負數了,說明如果再用這個數加後面的數隻會使和變小,所以把current_max賦值為0,但是需要額外考慮的就是陣列全為負數的情況。用這種方法可以把時間複雜度降到o(n)。

第三種思路可以考慮動態規劃的方法,但是用動態規劃解決問題的思路我還沒有弄的太明白,等弄明白後在補充到這裡。

#include #include #define max(a, b) ((a)>(b)?(a):(b))

int main(int argc, char const *argv)

} printf("the restult is : %d\n", max);

free(numbers);

printf("please input the integer n(n > 0):\n");

} return 0;

}

看計算時的那個for迴圈,我的思路是先進行相加在考慮是否改變current_max和max,還有一種思路是

考慮利用上一次current_max的值來判斷對current_max操作,即求和或者賦值為當前陣列元素的值,之後在設定全域性最大值max(見參考文獻1),這裡給出這種情況求和的偽**:

max=numbers[0];       

current_max=0;

for(i=0;i=0)

current_max+=numbers[i];

else

current_max=numbers[i];

if(current_max>max)

max=current_max;

}

我把上面兩種方法(第一種是先求和在判斷是否改變current_max,第二種是根據前一次的current_max來判斷這次是否需要求和還是賦值current_max為當前的整數陣列元素)。

第一組測試資料(只有乙個數)如下圖:

第二組測試資料(一負一正)如下圖:

第三組測試資料(全負)如下圖:

第四組測試資料(正負都有)如下圖:

1. 程式設計師程式設計藝術:第七章、求連續子陣列的最大和:

說明:

N 組連續子串最大和

陣列 a 中有 m 個數 將 m 個數分成 n 組 並且每組中的資料順序和原陣列中的順序保持一致,求 n 組中的資料之和最大為多少?向 dp 陣列中賦初始值 如果 m n 則 dp i i dp i 1 i 1 a i 若n為1時 即為求連續子串最大和問題 假設dp 1 i 2 i m 代表 與第 ...

最大和連續子陣列

問題描述 乙個數值型陣列,其子陣列有多個,求其子陣列中最大的和值。所謂和值,是指數組所有元素相加的和。解法 1 掃瞄法,維護max變數,儲存最大和,其初始值為data 0 假設最大和子陣列的第一位下標為i,i從0到n 1,對於每個i值,從data i 開始,進行累加,每加乙個數,與max變數比較一次...

連續子陣列最大和

hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個開始,到第...