使用双指针从两端遍历数组,根据遍历的情况决定往左边加数还是往右边加数,

遍历完的条件是两个指针相遇,至于中间分一组这个要求,可以直接不做处理

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n;
    while (cin >> n) {
        vector<int> d;
        long long money;
        for (int i = 0; i < n; i++) {
            cin >> money;
            d.push_back(money);
        }
        long long leftSum = d[0], rightSum = d[n - 1];
        long long ans = 0;
        long long left = 0, right = n - 1;
        while (left < right) {
            if (leftSum > rightSum) { // 左边的和大于右边的,需要往右边加一个数
                right--;
                rightSum += d[right];
            } else if (leftSum < rightSum) { // 右边的和大于左边的,需要往左边加一个数
                left++;
                leftSum += d[left];
            } else { // 两边之和相等,记录下最大和;同时往左边加一个数,推进循环
                ans = leftSum;
                left++;
                leftSum += d[left];
            }
        }
        cout << ans << endl;
    }
    return 0;
}

时间复杂度:O(n),遍历数组

空间复杂度:O(n),存储数组