# 1712. Ways to Split Array Into Three Subarrays ###### tags: `Leetcode` `Medium` `Prefix Sum` `Binary Search` Link: https://leetcode.com/problems/ways-to-split-array-into-three-subarrays/description/ ## 思路 ### Prefix Sum + Binary Search $O(NlogN)$ 用回圈挪动left array的end 然后用binary search找到mid array所有可能的终点(限制条件是mid array的total sum 大于等于left array的total sum,小于等于mid array+right array的total sum的1/2) ### Prefix Sum + Two Pointers $O(N)$ 还是用回圈挪动left array的end 但是仔细观察会发现mid array的end的左端点和右端点都是只会往右边挪的 因此可以用双指针 ## Code ```python= class Solution: def waysToSplit(self, nums: List[int]) -> int: n = len(nums) prefix = [0] for x in nums: prefix.append(prefix[-1]+x) ans = 0 mod = 1e9+7 for i in range(1, n): left = bisect.bisect_left(prefix, 2*prefix[i]) right = bisect.bisect_right(prefix, (prefix[i]+prefix[-1])//2) ans += max(0, min(len(nums),right)-max(i+1,left)) return (int)(ans%mod) ``` ```python= class Solution: def waysToSplit(self, nums: List[int]) -> int: n = len(nums) prefix = [0] for x in nums: prefix.append(prefix[-1]+x) ans = 0 mod = 1e9+7 left = right = 0 for i in range(1, n): left = max(left, i+1) while left<n and prefix[left]<2*prefix[i]: left+=1 right = max(left, right) while right<n and 2*prefix[right]<=prefix[i]+prefix[-1]: right+=1 ans += right-left return (int)(ans%mod) ```