1、前綴和介紹
對於一個數組A,我們新建一個長度相等的數組B,新數組中的每一項B[i]表示的是數組A的前i項和,即
前綴和:B中的每一項B[i]保存A[0,1,...,i]的和;
類似的概念還有:
後綴和:B中的每一項B[i]保存A[i,i+1,...,n−1]的和;
前綴積: B中的每一項B[i]保存A[0,1,...,i]的積;
後綴積: B中的每一項B[i]保存A[i,i+1,...n−1]的積;
2、前綴和性質
(1)B[i]=A[i]+(i>1?B[i−1]:0);
(2)A[i]+A[i+1]+...+A[j]=B[j]−B[i];
3、前綴和應用
(1) 數組分成差值最小的兩部分
尋找一個位置p,把數組nums從位置p分開,使得nums[0]+nums[1]+...+nums[p]與nums[p+1]+nums[p+2]+...+nums[n−1]之差的絕對值最小。
分析:這道題相當於求位置p,使得位置p的前綴和與整個數組和-位置p的前綴和的差的絕對值最小,即:
minabs{sum[p]−(sum[n]−sum[p]}=minabs{2∗sum[p]−sum[n]}
(2)和爲0的子數組
在數組nums中找到所有和爲0的子數組,返回這些子數組的起始和終止下標。
分析:若nums[i]+nums[i+1]+...+nums[j]=0,則有nums[0]+nums[1]+...+nums[j]=nums[0]+nums[1]+...+nums[i−1],即nums[i−1]=nums[j],根據這一性質,我們可以知道和爲0的子數組包含兩種情況:
a、位置i的前綴和爲0,子數組的起始位置和終止位置分別爲0和i;
b、位置i的前綴和和位置j的前綴和相等,子數組的起始位置和終止位置分別爲i+1和j。
(3)最接近0的子數組和
找到和最接近0的子數組。
分析:對前綴和數組進行排序,然後看相鄰排序後數組的相鄰兩個值sum[i]和sum[j]是否接近,若接近,則子數組nums[i+1,...,j]的和接近0.