题目描述
- 给定一个数组,问是否可以按顺序分成三份,每份之和一样
示例
输入:arr = [0,2,1,-6,6,-7,9,1,2,0,1]
输出:true
解释:(0 2 1), (-6 6 -7 9 1), (2 0 1)
输入:arr = [0,2,1,-6,6,7,9,-1,2,0,1]
输出:false
输入:arr = [3,3,6,5,-2,2,5,1,-9,4]
输出:true
题解
- 思路
- 虽然是简单题,但数组长度为 5w,暴力肯定超时
- 求和,找三分之一和的位置
- 可以按顺序找,判断边界是否越界(需要找三次);也可以找首尾,然后判断中间是否存在(需要找两次)
func canThreePartsEqualSum(arr []int) bool {
sum := 0
for _, v := range arr { sum += v }
if sum % 3 != 0 { return false }
sum /= 3
i, j := 0, len(arr) - 1
for s := 0; i < len(arr); i ++ {
s += arr[i]
if s == sum { break }
}
for s := 0; j >= 0; j -- {
s += arr[j]
if s == sum { break }
}
return i + 1 < j
}