给你一个整数数组 arr,只有可以将其划分为三个和相等的 非空 部分时才返回 true,否则返回 false。
形式上,如果可以找出索引 i + 1 < j 且满足 (arr[0] + arr[1] + … + arr[i] == arr[i + 1] + arr[i + 2] + … + arr[j - 1] == arr[j] + arr[j + 1] + … + arr[arr.length - 1]) 就可以将数组三等分。
示例 1:
输入:arr = [0,2,1,-6,6,-7,9,1,2,0,1]
输出:true
解释:0 + 2 + 1 = -6 + 6 - 7 + 9 + 1 = 2 + 0 + 1
示例 2:
输入:arr = [0,2,1,-6,6,7,9,-1,2,0,1]
输出:false
示例 3:
输入:arr = [3,3,6,5,-2,2,5,1,-9,4]
输出:true
解释:3 + 3 = 6 = 5 - 2 + 2 + 5 + 1 - 9 + 4
提示:
- 3 <= arr.length <= 5 * 10^4
- -10^4 <= arr[i] <= 10^4
解题思路
1.首先对数组进行求和,然后用num来表示和为三分之一总和的片段数
2.接着遍历整个数组,用temp来表示每一个片段的和,若等于三分之一总和,则num–,且temp重新赋值
3.以此循环,直至num<=0则说明可以将数组分成和相等的三个部分
代码
/**
* @param {number[]} arr
* @return {boolean}
*/
var canThreePartsEqualSum = function(arr) {
let sum = arr.reduce((a,b) => a + b)
let num = 3
let temp = 0
for(let a of arr){
temp += a
if (temp === sum / 3) {
num--;
temp = 0;
}
}
return num <= 0
};