技术文档前缀和
前缀和
算法
内容
谨记: 数组不是单调的话,不要用滑动窗口,考虑用前缀和 用来解决的问题:计算连续子数组的和
- 303-区域和检索
- 560-和为k的子数组
算法思想
- 原数组
a=[-2,0,3,-5,2,-1] - 前缀和数组
s=[0,-2,-2,1,-4,-1,-3]
定义s=[0]*(len(a)+1)
s[0]=0
s[1]=a[0]
s[2]=a[0]+a[1]
.
.
.
s[n+1]=a[0]+a[1]+...+a[n]
要计算a中left指针到right指针的和:
r=right指针 l=left指针
前缀和数组s:
s[r+1]=a[0]+a[1]+...+a[r]
s[l]=a[0]+...+a[l-1]
=> s[r+1]-s[l]=a[l]+...+a[r]
s=[0]*(len(nums)+1)
for i in range(len(nums)):
s[i+1]=s[i]+nums[i]
Q:为什么要定义s[0]=0?
A: 如果不定义s[0]=0 那么就要算s[r]=s[l-1],如果l=0就需要分情况讨论了(s[-1]会有error)