题解 | #牛群的最大能量环#
牛群的最大能量环
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; } }