题目
原题链接
算法
- 暴力算法肯定时间超时,数组分成3份,利用双指针法可以实现线性时间
- 设第一个指针
i
=
0
i=0
i=0,第二个指针
j
=
A
.
s
i
z
e
(
)
−
1
j=A.size()-1
j=A.size()−1,接下来判断指针移动的条件
- 因为数组中的元素有正有负,所以我们不能通过比较大小的方式来判断指针移动,那么我们就直接从结果出发,如果有一份的和不等于和的
1
/
3
1/3
1/3,我们就移动指针直到不能移动为止
- 最后判断条件,注意一定要
i
+
1
<
j
i+1<j
i+1<j
AC代码(c++)
class Solution {
public:
bool canThreePartsEqualSum(vector<int>& A) {
int i=0;
int j=A.size()-1;
int sum=0;
for(int m=0;m<A.size();m++)
sum=sum+A[m];
if(sum%3!=0)
return false;
int arg=sum/3;
int S1=A[i];
int S3=A[j];
while(arg!=S1&&i<A.size()-1)
{
i++;
S1=S1+A[i];
}
while(arg!=S3&&j>0)
{
j--;
S3=S3+A[j];
}
if(i+1<j&&S1==arg&&S3==arg)
return true;
return false;
}
};