Leetcode 1712. Ways to Split Array Into Three Subarrays [Python]

题目不好整啊,开始以为是DP,看了HInt,后来看了大神写的二分查找的答案。首先建立一个前缀和序列。后开始遍历第一段sub array的截止位置,由题目限制可知,其最大的截止位置带来的前缀和要小于等于全nums的和,也就是前缀和序列最后一位。好了,知道第一个分割点在哪里,就可以对后面这段做分割了。在第一段知道截断位置的前提下,中间这段的和,最小也需要是第一段subarray的和的两倍。由此可以得到第二段suabarray截断点的最小位置。而其最大位置,可以这样求的,第一段的截止位置的和 与全nums的和的中间值,在第一段截断后的后面这一大段所能排到的位置,这样,保证了我们作出的第二段的截断点右边的subarray的和不会大于剩下的这一大段的和的一半。同时,要处理特殊情况就是全部数字一样时,则第二段的最大位置可能会大于len(nums)。同样,需要注意最大的第二段截断位置的subarray的值如果因为设置了,其位置必须大于最小的截断位置时而带来所得位置的subaray的值大于了剩下一大段的和的一半,这种情况需要特判。

class Solution:
    def waysToSplit(self, nums: List[int]) -> int:
        prefix = [nums[0]]
        for i in range(1, len(nums)):
            prefix.append(prefix[-1]+ nums[i])
            
        res = 0
        Mod = 10**9+7
        
        for i in range(len(prefix)):
            firstseg = prefix[i]
            if firstseg*3 > prefix[-1]:break
            
            second_first_seg = firstseg*2
            second_first_seg_pos = bisect.bisect_left(prefix, second_first_seg, i+1)
            
            second_second_seg = (prefix[i] + prefix[-1])//2
            second_second_seg_pos = bisect.bisect_right(prefix, second_second_seg, second_first_seg_pos+1)
            
            if second_second_seg_pos > len(nums) or prefix[second_second_seg_pos-1] > second_second_seg:continue
            res = (res + (min(len(nums)-1, second_second_seg_pos) - second_first_seg_pos))%Mod
        return res
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值