周末回顾题5
原题:点击此处
数组简单题,做一下用来放松。
考点:数组,双指针
解题:
1.如果数组长度不够3,fasle;
2.如果数组总和取余不为0,false;
3.数组总和除3,得到判断条件situation。
3.双指针思想:
左边设一个指针,右边设一个指针。
左边往右边遍历,找到总和等于situation的时候停下。
右边往左边遍历,找到总和等于situation的时候停下。
为了保证三等分,当左边指针到《length-2》这个位置的时候,就必须停下来。右边指针和左边指针重合时,也必须停下来。
4.注意!下面这段代码的用意,为什么不能设置从0开始?
因为会存在边界条件。
int left = A[0];
int right = A[A.length-1];
下面为完整代码:
(写得不够简约,不过思路应该比较明朗)
class Solution {
public boolean canThreePartsEqualSum(int[] A) {
// 特殊条件
if(A.length < 3){
return false;
}
int total = 0;
for(int i:A){
total += i;
}
int situation = total / 3;
// 如果不能三等分,也没必要算了
if(total % 3 != 0){
return false;
}
int left = A[0];
int right = A[A.length-1];
int lstart = 1;
int rstart = A.length-2;
while(left != situation){
// 防止过分加
if(lstart == A.length -2){
break;
}
left += A[lstart];
lstart++;
}
while(right != situation){
// 指针重合说明已经到达三等分的极限了
if(rstart == lstart){
break;
}
right += A[rstart];
rstart--;
}
if(left == right && left == situation){
return true;
}
return false;
}
}