将数组分成和相等的三个部分


题目来源:https://leetcode-cn.com/problems/partition-array-into-three-parts-with-equal-sum/

题目


题目:将数组分成和相等的三个部分

解题思路


直接遍历

思路:直接遍历查找。

先处理特殊情况,当总和不能被 3 整除,那么直接返回 False

定义变量 sign,当遍历累加等于三等分的数值时,加 1,作为统计达到均分数值的次数。

sign 数值大于等于 3 时,则返回 True,表示总和可三等均分。这里 sign 大于等于 3,是因为有特殊的情况,例如:

[1, -1, 1, -1, -1, 1, 1, -1]

当遇到这种情况的时候,sign 并不等于 3,但这个数组同样可以三等均分。

双指针

思路:双指针。

同样先处理特殊情况,同上。

定义左右指针 left,right,左指针指向开头,右指针指向末尾。从数组两边一起查找。定义左边部分的和为 left_sum,右边部分的和为 right_sum,初始数值均为指针指向索引对应数组的数值。

left_sum 数值不等于三等分的数值,指针向右移动,进行累加;当 right_sum 数值不等于三等分的数值,指针向左移动,进行累加。

这里有个约束的条件,就是 left + 1 < right。这里是为了避免数组达成条件时,只被分成两部分,不符合题意的三等分。

代码实现


代码(直接遍历)

class Solution:
    def canThreePartsEqualSum(self, A: List[int]) -> bool:
        # 排除特殊情况
        s = sum(A)
        if s % 3 != 0:
            return False
        
        # 定义 sign 统计总和达到目标值的次数
        sign = 0
        third = s // 3
        
        res = 0
        for num in A:
            res += num
            # 总和等于目标值时,sign + 1,同时重置计算总和的变量 res
            if res == third:
                sign += 1
                res = 0
        
        # 这里是为了排除如 [1, -1, 1, -1, -1, 1, 1, -1] 的特殊情况
        # sign 不一定等于 3
        return sign >= 3

代码(双指针)

class Solution:
    def canThreePartsEqualSum(self, A: List[int]) -> bool:
        # 排除特殊情况
        s = sum(A)
        if s % 3 != 0:
            return False
        
        # 定义左右指针
        left = 0
        right = len(A) - 1
        # 定义左右部分的初始值为左右指针指向索引对应数组的数值
        left_sum = A[left]
        right_sum = A[right]

        third = s // 3
        
        # 约束条件
        while left + 1 < right:
            # 当左右两部分等于均分数值,则中间部分一定符合条件
            if left_sum == third and right_sum == third:
                return True
            # 左边部分的总和不等于目标值时,向右移动
            if left_sum != third:
                left += 1
                left_sum += A[left]
            # 右边部分的总和不等于目标值时,向左移动
            if right_sum != third:
                right -= 1
                right_sum += A[right]
        return False

实现结果


结果(直接遍历)

结果:直接遍历

结果(双指针)

结果:双指针方法


以上就是使用直接遍历,双指针两种方法,解决《将数组分成和相等的三个部分》问题的主要内容。

欢迎关注微信公众号《书所集录》

大梦三千秋
41 声望5 粉丝

为而不争