accumulate()方法詳解

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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章