题解 | #牛群的最大能量环# 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。 - 返回最终的结果。

