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;
}
};