DFS+剪枝
先找到第一个满足的数组 然后从剩余的数组中找另外两个和等于target的数组
看了题解才发现有更好的双指针解法。
class Solution {
public:
vector<int> sum;
bool res = false;
bool canThreePartsEqualSum(vector<int>& A) {
//先求出前缀和 然后枚举
if(A.size() < 3) return false;
sum.push_back(A[0]);
for(int i= 1; i < A.size(); i++) sum.push_back(sum.back() + A[i]);
if(sum[A.size() -1]%3) return false;
int t = sum[A.size() -1]/3;
for(int i = 0; i < A.size(); i++){
if(t == sum[i]) dfs(i+1, i, 0, t, 0); //当前位置 从哪儿开始 枚举第几个组合
}
return res;
}
void dfs(int u, int start, int k, int target, int now){
if(res || k > 2) return;
if(u == sum.size()){
if(u==sum.size() && k == 2 && now == 0){
res = true;
}
return;
}
int cur=sum[u] - sum[start];
if(cur == target) k++, cur = 0, start = u;
dfs(u+1, start, k, target, cur);
}
};
双指针
class Solution {
public:
bool canThreePartsEqualSum(vector<int>& A) {
//从前面求数组和为target 从后面求和为target 判断中间是否也为target
vector<int> sum;
if(A.size() < 3) return false;
sum.push_back(A[0]);
for(int i= 1; i < A.size(); i++) sum.push_back(sum.back() + A[i]);
if(sum[A.size() -1]%3) return false;
int t = sum[A.size() -1]/3;
int i, j;
//前面数组和
for(i = 0; i < A.size(); i++){
if(t == sum[i]) break;
}
//后面数组和
int sumx = 0;
for(j = A.size()-1; j > i; j--){
sumx+=A[j];
if(sumx == t) break;
}
//中间数组和
sumx = 0;
for(int k = i+1; k < j; k++){
sumx+=A[k];
}
return sumx == t && j - i > 1;
}
};