题解 | #牛群的最大能量环# java
牛群的最大能量环
https://www.nowcoder.com/practice/653d5a6041a04b8cb9b082eeb1429d1c
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,用于记录能量数组的总和;curMax
和maxSum
都初始化为energy[0]
,用于记录当前最大子数组和和最大子数组和;curMin
和minSum
都初始化为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。 - 返回最终的结果。