問題:
1. 給定乙個陣列其每個元素都是正數,和乙個給定值m,求所有連續的子陣列其和等於m。
2. 給定乙個正數n,求所有和為n的連續正數序列。
這類求子陣列之和的問題與程式設計之美2.12——快速尋找滿足條件的兩個數或三個數問題的求解思路相似,都是可用雙指標法在o(n)的時間內解決。
1.解法:
我們讓兩個指標i,j都從陣列的第乙個元素開始,記變數sum初始化為第乙個元素的值,sum表示子陣列[i,j]的元素之和。在每步操作中,若sum的值小於等於m,則j增加1,並且讓sum加上元素a[j];若sum的值大於m,則先讓sum減去元素a[i],再i增加1。
[cpp]view plain
copy
// 求連續子串行和等於m
void
findsumk(
int*a,
intn, unsigned
intm)
// sum小於m,增加j,以增大sum
else
} }
2.解法:
讓我們先舉個例子,例如輸入15,由於1+2+3+4+5=4+5+6=7+8=15,所以輸出3個連續的序列1-5,4-6和7-8。
同樣是計算子陣列之和,同樣使用雙指標法,具體分析同上。唯一需要注意下它的邊界條件,由於子陣列至少要有兩個數字,所以較小的指標的位置遍歷到n/2就結束。
[cpp]view plain
copy
// 求所有和為n的連續正數序列
void
findsumn(
intn)
else
}
求整數陣列中和最大的子陣列的和
鄭雲飛 韓亞華 這個問題的複雜性和不確定讓我們讓我們想到了列舉,求出每乙個子陣列的和,但這樣我們我們程式的時間複雜度 將會非常高,於是我們想把辦法簡化它。首先我們將陣列裡連續的正數和負數就和,這樣我們將得到乙個正負相間的 整數陣列。然後再對正整數陣列求最大子陣列,這樣最大子陣列必定是兩頭為正,有奇數...
求最大連續子陣列之和
給定k個整數的序列,其任意連續子串行可表示為,其中 1 i j k。最大連續子串行是所有連續子串行中元素和最大的乙個,例如給定序列,其最大連續子串行為,最大和 為20。6 211 4 13 5 2 10 1012 34 5 23 37 21 65 8 3 2 5 0110 3 1 5 23 1 0 ...
陣列中最大的子陣列之和
乙個有n個整數元素的一維陣列 a 0 a 1 a n 1 求子陣列之和的最大值。例子 1,2,3,5,3,2 返回 8 0,2,3,5,1,2 返回 9 9,2,3,5,3 返回 2 需要注意的是,如果考慮到陣列首尾相連,則 1 先按不相連計算出最大值max 2 從尾往頭掃瞄,找出最大值m1,並記錄...