题目描述

LeetCode将数组分成和相等的三个部分_双指针


LeetCode将数组分成和相等的三个部分_两个指针_02

方法一:直接遍历

  • 从前往后遍历,记录下和为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;
}