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
posted @ 2021-01-03 15:32  童年の波鞋  阅读(104)  评论(0编辑  收藏  举报