「这是我参与11月更文挑战的第 24 天,活动详情查看:2021最后一次更文挑战」
原题链接
1013. 将数组分成和相等的三个部分 - 力扣(LeetCode) (leetcode-cn.com)
题目描述
给你一个整数数组 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.length <= 5 * 104
-104 <= arr[i] <= 104
分析
初看题目,以为需要使用贪心去将数组元素划分为3块,保证每一块的数据之和都相等。但仔细阅读后,其实是在原数组上,直接切两刀,我们只需要定位到这两刀切割的位置,以及数组是否可以通过这种方式去获得3个和相等的部分
注意,我们需要保证每个子数组都起码包含一个元素!
我们需要计算出数组的总和,再获得每个子数组的和
在数组可以切分成 3 份的情况下,我们只需要求出前2部分的数组和的界限位置,如果求出了 2 个分界线,并且最后一个数组还有元素,就可以返回 true
;除这情况之外,都需要返回 false
代码
var canThreePartsEqualSum = function(arr) {
let sum = arr.reduce((a, b) => a + b, 0);
if (sum % 3 != 0) return false;
let avg = sum / 3;
let n = 2;
// 从头开始遍历,找到 i,j
let count = 0;
for (let i = 0; i < arr.length - 1; i++) {
count += arr[i];
if (count == avg) {
n--;
count = 0;
}
if (n == 0) {
break;
}
}
return n == 0;
};
今天的力扣刷题就分享到这里,感谢大家的阅读~