📅  最后修改于: 2023-12-03 15:25:19.453000             🧑  作者: Mango
写一个函数,给定一个数组,判断能否将其分成三个相等的和段。如果可以,返回 true ;否则,返回 false 。
例如,输入数组 [0,2,1,-6,6,-7,9,1,2,0,1] 可以被分成三个相等的和段,即 [0,2,1], [-6,6,-7,9,1], [2,0,1]。 因此,该函数应返回 true 。
代码实现如下:
def canThreePartsEqualSum(A):
"""
:type A: List[int]
:rtype: bool
"""
total = sum(A)
if total % 3 != 0:
return False
target = total // 3
n = len(A)
i, cur_sum = 0, 0
while i < n:
cur_sum += A[i]
if cur_sum == target:
break
i += 1
if cur_sum != target:
return False
j = i + 1
while j < n - 1:
cur_sum += A[j]
if cur_sum == target * 2:
return True
j += 1
return False
首先可以算出整个数组的和,然后判断是否能被 3 整除。如果不能整除,就不可能把数组分成三等份,直接返回 False。
接下来,我们需要找到每一部分的和,那么每一部分的和就必须是整个数组和的 1/3 。因为题目要求每一部分的和必须相等。用一个游标从左往右扫描数组,记录当前的和,当和达到目标值时,停止。这个时候,我们找到了第一个部分的和。
接下来,我们需要找到第二部分的和。使用一个新游标从第一个部分的右边开始扫描数组,每当和达到目标值时,停止。这个时候,前两个部分的和已经达到了目标的 2/3 ,剩下一部分的和也就是目标的 1/3。如果存在第三部分,那么第三部分的和肯定等于目标的 1/3 ,因此第三部分一定存在,返回 True。