b_lc_将数组分成三个子数组的方案数(双指针 / 二分优化)
将数组A分成三个部分,他们的和分别等于:L,M,R,求出使得:L<=M,M<=R的方案数
思路:枚举i∈[0,n-1],求一个区间range,使得区间range中任意一个位置k作为M和R的分割点,即都能使得pre[i+1]<=pre[k+1]-pre[i+1]<=pre[n]-pre[k+1]
,这是我的第一思路
可用二分法优化掉这个区间的查找过程
class Solution:
def waysToSplit(self, A: List[int]) -> int:
n,mod,ans=len(A),int(1e9+7),0
j,k,pre=1,1,[0]*(n+1)
for i in range(n):
pre[i+1]=pre[i]+A[i]
for i in range(0,n-1):
j=max(j,i+1)
while j<n-1 and pre[j+1]-pre[i+1]<pre[i+1]:
j+=1
if j==n-1: break #证明不合法
k=max(k,j)
while k<n-1 and pre[k+1]-pre[i+1]<=pre[n]-pre[k+1]: #求这个合法区间[j,k]
k+=1
ans=(ans+k-j)%mod
return ans