import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param energy int整型一维数组
     * @return int整型
     */
    public int maxEnergyCircular (int[] energy) {
        // write code here
        int total = 0, curMax = 0, maxSum = energy[0], curMin = 0, minSum = energy[0];
        for (int a : energy) {
            total += a;
            curMax = Math.max(curMax + a, a);
            maxSum = Math.max(maxSum, curMax);
            curMin = Math.min(curMin + a, a);
            minSum = Math.min(curMin, minSum);
        }

        if (maxSum >= 0) {
            return Math.max(total - minSum, maxSum);
        } else {
            return maxSum;
        }
    }
}

编程语言是Java。

该题考察的知识点是动态规划。

代码的文字解释:

  • maxEnergyCircular方法接受一个整型数组energy作为参数,并返回一个整数。
  • 初始化变量total为0,用于记录能量数组的总和;curMaxmaxSum都初始化为energy[0],用于记录当前最大子数组和和最大子数组和;curMinminSum都初始化为energy[0],用于记录当前最小子数组和和最小子数组和。
  • 使用循环遍历能量数组中的每个元素a。在每次循环中,更新total为原值加上当前能量值a。更新curMax为当前能量值a和curMax + a的较大值,即记录当前最大子数组和。更新maxSum为当前最大子数组和curMax和之前的最大子数组和maxSum的较大值,即记录到目前为止的最大子数组和。更新curMin为当前能量值a和curMin + a的较小值,即记录当前最小子数组和。更新minSum为当前最小子数组和curMin和之前的最小子数组和minSum的较小值,即记录到目前为止的最小子数组和。
  • 循环结束后,根据最大子数组和maxSum的值判断:若maxSum大于等于0,说明最大子数组和可以跨越数组的首位连接起来,返回总和减去最小子数组和total - minSum和最大子数组和maxSum的较大值。若maxSum小于0,则无需跨越数组的首位,直接返回最大子数组和maxSum。
  • 返回最终的结果。