[每日一题]1013.将数组分成和相等的三个部分
1013. 将数组分成和相等的三个部分 给你一个整数数组 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])
就可以将数组三等分。
输入: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
提示:
- 3 <= arr.length <= 5 * 104
- -104 <= arr[i] <= 104
Solutions
class Solution {
public boolean canThreePartsEqualSum(int[] arr) {
// 对数组求和
int arrSum = 0;
for(int i = 0; i < arr.length; i++){
arrSum += arr[i];
}
// 如果数组和不能被 3 整除,则不能划分为三个和相等的
if(arrSum % 3 != 0){
return false;
}
// 求“相等的和”的“和”
int singleSum = arrSum / 3;
// 三部分
int cnt = 3;
// 记录每部分的和
int tempSum = 0;
for(int i = 0; i < arr.length; i++){
if(tempSum + arr[i] == singleSum){
if(cnt > 0){
cnt --;
tempSum = 0;
}
else{
tempSum += arr[i];
}
}
else{
tempSum += arr[i];
}
}
if(cnt == 0 && tempSum == 0){
return true;
}
else{
return false;
}
}
}