输入:[3,3,6,5,-2,2,5,1,-9,4]
输出:true
解释:3 + 3 = 6 = 5 - 2 + 2 + 5 + 1 - 9 + 4
最开始的时候尝试将数组分成三部分分别求其和,但发现在某些测试例中会陷入死循环。
将数组分成和相等的N个部分也可参照该方法进行改进
public boolean canThreePartsEqualSum(int[] A) {
if(A.length<3||A==null) return false;
//其思想为先找第一部分其值为sum/3
//然后找第三部分其值为sum/3
//如果找到切h-l>0则返回true
//时间复杂度为O(n)
int sum=0;
int length=A.length;
for (int i = 0; i < length; i++) sum+=A[i];
if(sum%3!=0) return false; //如果数组之和取模3非0则无法分成三等份
int lr=0; //第一部分结果
int hr=0; //第三部分结果
int l=0; //第一部分结尾下标
int h=length-1; //第三部分开始下标,初始值随意,但必须h-l>0
boolean lo=false; //第一部分是否查找结束
boolean ho=false; //第三部分是否查找结束
int r=sum/3; //目标值
for (int i = 0; i < length&&h>l+1; i++) {
if(!lo){
l=i;
if((lr+=A[l])==r){
lo=true;
}
}
if(!ho){
h=length-1-i;
if((hr+=A[h])==r){
ho=true;
}
}
if(lo&&ho){
return true;//达到目标,返回true
}
}
return false;
}