zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    Spring中的一些常用接口
    ApplicationContextAware的作用
    用spring的 InitializingBean 的 afterPropertiesSet 来初始化
    虚拟机扩容(/dev/mapper/centos-root 空间不足)
    AJAX
    Git
    jQuery
    JS
    JS
    jQuery
  • 原文地址:https://www.cnblogs.com/wdt1/p/14225674.html
Copyright © 2011-2022 走看看