题目描述:
给你一个整数数组 A,只有可以将其划分为三个和相等的非空部分时才返回 true,否则返回 false。
形式上,如果可以找出索引 i+1 < j 且满足 (A[0] + A[1] + … + A[i] == A[i+1] + A[i+2] + … + A[j-1] == A[j] + A[j-1] + … + A[A.length - 1]) 就可以将数组三等分。
方法一:
- 数组元素的总和 sum 不是3的倍数,直接返回false
- 遍历数组,如果和等于总和除以3,就通过count计数
- count>=3返回true
class Solution {
public boolean canThreePartsEqualSum(int[] A) {
int len=A.length;
int sum=0;
for(int i=0;i<len;i++){
sum+=A[i];
}
if(sum%3!=0){
return false;
}
int a=sum/3;
int sum1=0;
int count=0;
for(int i=0;i<len;i++){
sum1+=A[i];
if(sum1==a){
count++;
sum1=0;
}
}
return count>=3;
}
}
方法二:
- 数组元素的总和 sum 不是3的倍数,直接返回false
- 使用双指针left,right, 从数组两头开始一起找,节约时间 当 left + 1 < right 的约束下,可以找到数组两头的和都是
sum/3,那么中间剩下的元素和就一定也是sum/3 - (left + 1 < right的约束就是要中间有剩下的元素,使用left <
right的约束,数组可能可以恰好被划分成两部分,中间没有元素)
class Solution {
public boolean canThreePartsEqualSum(int[] A) {
int len=A.length;
int sum=0;
for(int i=0;i<len;i++){
sum+=A[i];
}
if(sum%3!=0){
return false;
}
int a=sum/3;
int left=0;
int right=len-1;
int leftsum=A[left];
int rightsum=A[right];
while(left+1<right){
if(leftsum==a&&rightsum==a){
return true;
}
if(leftsum!=a){
leftsum+=A[++left];
}
if(rightsum!=a){
rightsum+=A[--right];
}
}
return false;
}
}