通用算法 - [數組算法] -數組的前綴和

1、前綴和介紹

對於一個數組AA,我們新建一個長度相等的數組BB,新數組中的每一項B[i]B[i]表示的是數組AA的前ii項和,即
前綴和BB中的每一項B[i]B[i]保存A[0,1,...,i]A[0,1,...,i]的和;

類似的概念還有:
後綴和BB中的每一項B[i]B[i]保存A[i,i+1,...,n1]A[i,i+1,...,n-1]的和;
前綴積: BB中的每一項B[i]B[i]保存A[0,1,...,i]A[0,1,...,i]的積;
後綴積: BB中的每一項B[i]B[i]保存A[i,i+1,...n1]A[i,i+1,...n-1]的積;

2、前綴和性質

(1)B[i]=A[i]+(i>1?B[i1]:0)B[i] =A[i] + (i > 1 ? B[i-1] : 0 );
(2)A[i]+A[i+1]+...+A[j]=B[j]B[i]A[i]+A[i+1]+...+A[j] = B[j] - B[i];

3、前綴和應用

(1) 數組分成差值最小的兩部分
尋找一個位置pp,把數組numsnums從位置pp分開,使得nums[0]+nums[1]+...+nums[p]nums[0]+nums[1]+...+nums[p]nums[p+1]+nums[p+2]+...+nums[n1]nums[p+1] + nums[p+2]+...+nums[n-1]之差的絕對值最小。
分析:這道題相當於求位置pp,使得位置pp的前綴和與整個數組和-位置pp的前綴和的差的絕對值最小,即:
minabs{sum[p](sum[n]sum[p]}=minabs{2sum[p]sum[n]}minabs\{ sum[p] - (sum[n] - sum[p] \} = minabs \{ 2*sum[p] - sum[n] \}

(2)和爲0的子數組
在數組nums中找到所有和爲0的子數組,返回這些子數組的起始和終止下標。
分析:若nums[i]+nums[i+1]+...+nums[j]=0nums[i] + nums[i+1] + ... + nums[j]=0,則有nums[0]+nums[1]+...+nums[j]=nums[0]+nums[1]+...+nums[i1]nums[0] + nums[1] + ... + nums[j] = nums[0] + nums[1] +... +nums[i-1],即nums[i1]=nums[j]nums[i-1]=nums[j],根據這一性質,我們可以知道和爲00的子數組包含兩種情況:
a、位置ii的前綴和爲00,子數組的起始位置和終止位置分別爲00ii
b、位置ii的前綴和和位置jj的前綴和相等,子數組的起始位置和終止位置分別爲i+1i+1jj

(3)最接近0的子數組和
找到和最接近0的子數組。
分析:對前綴和數組進行排序,然後看相鄰排序後數組的相鄰兩個值sum[i]sum[i]sum[j]sum[j]是否接近,若接近,則子數組nums[i+1,...,j]nums[i+1,...,j]的和接近0.

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