题解 | #牛群的最大能量环#
牛群的最大能量环
https://www.nowcoder.com/practice/653d5a6041a04b8cb9b082eeb1429d1c
知识点:动态规划
思路:
- 首先,定义一个名为
maxEnergyCircular的静态方法,该方法接受一个整数数组作为参数,并返回一个整数。 - 找出能量数组中的最大值
mx,如果mx小于0,则直接返回该值,因为数组中所有能量值都是负数。 - 获取能量数组的长度
n。 - 创建两个辅助数组
l和r,分别用于记录从左到右和从右到左的最大累积能量值。 - 使用
for循环遍历能量数组,从左到右计算并保存累积能量值到数组l中。 - 使用另一个
for循环从右到左计算并保存累积能量值到数组r中。 - 初始化变量
res为Integer.MIN_VALUE,用于存储最终的最大环形能量值。 - 使用一个
for循环遍历数组l和r,计算每个位置的最大环形能量值,并更新res为其中的最大值。 - 初始化变量
sum为0,用于记录当前累积能量值。 - 使用增强型
for循环遍历能量数组,计算和更新当前累积能量值,并根据需要更新res的值。 - 如果当前累积能量值
sum小于0,则将其重置为0,因为负值对于最大环形能量值没有任何贡献。 - 循环结束后,返回
res作为最大环形能量值。 - 在
main方法中,创建一个示例用法,将一个能量数组作为参数传递给maxEnergyCircular方法,并打印出最大环形能量值。
编程语言:java
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param energy int整型一维数组
* @return int整型
*/
public static int maxEnergyCircular(int[] energy) {
int mx = Arrays.stream(energy).max().getAsInt();
if (mx < 0) return mx;
int n = energy.length;
int[] l = new int[n + 1];
int[] r = new int[n + 1];
int sum = 0;
for (int i = 1; i <= n; i++) {
sum += energy[i - 1];
l[i] = Math.max(l[i - 1], sum);
}
sum = 0;
for (int i = 1; i <= n; i++) {
sum += energy[n - i];
r[i] = Math.max(r[i - 1], sum);
}
int res = Integer.MIN_VALUE;
for (int i = 0; i <= n; i++) {
res = Math.max(res, l[i] + r[n - i]);
}
sum = 0;
for (int x : energy) {
sum += x;
res = Math.max(res, sum);
if (sum < 0) sum = 0;
}
return res;
}
}
查看12道真题和解析