C++中有一個累加求和函數:accumulate()。
該算法定義在numeric頭文件中。
假設有一個int型向量:vec,下面代碼
int sum = accumulate(vec.begin(),vec.end,0);
代表將向量vec中的數據累加賦值給sum。
accumulate有三個形參:前倆個指定累加的範圍,第三個表示累加初始值。
示例:
給你一個整數數組 A,只有可以將其劃分爲三個和相等的非空部分時才返回 true,否則返回 false。
輸入:[0,2,1,-6,6,-7,9,1,2,0,1]
輸出:true
解釋:0+2+1 = -6+6-7+9+2 = 2+0+1
思路:
要求一個向量是否可以被連續分成三部分,使得每部分的和相等,則此向量的總和一定是3的倍數,且被分成的每一部分的和都等於 總和 / 3。
所以先判斷總和,再令i,j將向量分成三部分,且:
vec[0]+vec[1]+…+vec[i] = 總和 / 3;
vec[i+1]+vec[i+2]+…+vec[j]= 總和 / 3;
最後一部分也就自然等於 總和 / 3;
判斷結束。
代碼:
class Solution {
public:
bool canThreePartsEqualSum(vector<int>& A) {
int s = accumulate(A.begin(), A.end(), 0); //先求向量的累加。
if (s % 3 != 0) {
return false;
}
int target = s / 3;
int n = A.size(), i = 0, cur = 0;
while (i < n) {
cur += A[i];
if (cur == target) {
break;
}
++i;
}
if (cur != target) {
return false;
}
int j = i + 1;
while (j + 1 < n) { // 需要滿足最後一個數組非空
cur += A[j];
if (cur == target * 2) {
return true;
}
++j;
}
return false;
}
};