题目描述
方法一:直接遍历
- 从前往后遍历,记录下和为sum/3的序列数量,找到3个就返回true
- 遍历完了,依然没有找到3个和为sum/3的序列,返回false
bool canThreePartsEqualSum(vector<int>& A) {
int sum = 0;
for(int num : A) sum += num;//求和
if (sum % 3 != 0) return false;
int part_sum = 0;
int count = 0;
for(int num : A){
part_sum += num;//当前的部分和
if(part_sum == sum / 3){
count++;
part_sum = 0;
}
if(count == 3) return true;
}
return false;//遍历完了,count依然不为3
}
};
方法二:双指针
- 左指针从左往右找和为sum/3的序列,找到就退出循环,找不到则指针指向最后一个元素
- 同样的,右指针从右往左找和为sum/3的序列,找到就退出循环,找不到则指针指向0号元素
- 最后比较两个指针的位置,若中间还有剩余元素,返回true,否则返回false
bool canThreePartsEqualSum(vector<int>& A) {
int sum = 0;
for(int num : A) sum += num;
if(sum % 3 != 0) return false;
int l = 0;
int r = A.size() - 1;
int l_sum = A[l];
int r_sum = A[r];
//左指针寻找,限制区间
while(l_sum != sum/3 && l < A.size() - 1){
l++;
l_sum += A[l];
}
//右指针寻找,限制区间
while(r_sum != sum/3 && r > 0){
r--;
r_sum += A[r];
}
//比较两指针的相对位置
if(l < r - 1) return true;
else return false;
}