题目考察的知识点:动态规划

题目解答方法的文字分析:最大子序列和如果在中间区域,那么就是找最大子序列和;最大子序列如果在末端和前端之和,这种情况不好找最大;但是可以找出数组的最小子序列和,然后用sum减最小子序列和就是最大子序列和。

本题解析所用的编程语言:c++

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param energy int整型vector 
     * @return int整型
     */
    int maxEnergyCircular(vector<int>& energy)
    {
        // write code here
        int fmax = 0, gmin = 0;
        int x = energy[0], y = energy[0], sum = energy[0];
        for (int i = 1; i < energy.size(); ++i)
        {
            fmax = max(energy[i], fmax + energy[i]);
            if (fmax > x)
                x = fmax;
            gmin = min(energy[i], gmin + energy[i]);
            if (gmin < y)
                y = gmin;

            sum += energy[i];
        }
        sum -= y;
        return max(sum, x);
    }
};