将数组分成和相等的三个部分
题目来源: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
实现结果
结果(直接遍历)
结果(双指针)
以上就是使用直接遍历,双指针两种方法,解决《将数组分成和相等的三个部分》问题的主要内容。
欢迎关注微信公众号《书所集录》
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。