📌  相关文章
📜  将数组分成三个相等的和段(1)

📅  最后修改于: 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。